Pindahkan tata letak saat keyboard lunak ditampilkan?


146

Saya memiliki beberapa elemen dalam RelativeView dengan set atribut align bottom, ketika soft keyboard muncul, elemen tersebut disembunyikan oleh soft keyboard.

Saya ingin mereka naik sehingga jika ada cukup ruang layar, mereka ditampilkan di atas keyboard, atau membuat bagian di atas keyboard dapat digulir sehingga pengguna masih dapat melihat elemennya.

Ada ide tentang cara mendekati ini?


Referensi yang diperbarui dari blog pengembang android
Jayabal

@Dinedal Bagaimana Anda menyetel atribut align bottom ke RelativeView Anda ???
KJEjava48

Jawaban:



98

Anda juga dapat menggunakan kode ini dalam onCreate()metode:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

12
Bagi saya, bahkan jika saya menyetel AdjustPan screnn pindah hanya ke teks edit yang telah saya klik tetapi tidak seluruh tata letaknya
murt


23

Lakukan perubahan dalam aktivitas file Manifest Anda seperti

android:windowSoftInputMode="adjustResize"

ATAU

Buat perubahan dalam onCreate()metode Anda di kelas aktivitas seperti

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
Mengapa Anda menggunakan bendera yang berbeda?
CoolMind

Versi saat ini membutuhkan awalan android: android: windowSoftInputMode = "adjustResize"
Andrea Leganza

21

masalah serupa yang saya hadapi dengan tata letak saya yang terdiri dari tampilan gulir di dalamnya. Setiap kali saya mencoba memilih teks di EditText, bilah tindakan Salin / Potong / Tempel akan dipindahkan dengan kode di bawah ini sehingga tidak mengubah ukuran tata letak

android:windowSoftInputMode="adjustPan"

Dengan memodifikasinya menjadi seperti di bawah ini

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) file style.xml, dalam gaya aktivitas

<item name="android:windowActionBarOverlay">true</item>

Berhasil. !!!!!!!!!!!!


18

Di AndroidManifest.xml, jangan lupa untuk menyetel:

 android:windowSoftInputMode="adjustResize"

dan untuk RelativeLayout di dalam ScrollView, setel:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

ini akan baik-baik saja


android: layout_gravity = "center" berfungsi, terima kasih! :) sekarang EditText bergerak di atas keyboard seperti yang saya inginkan
Pavel Biryukov

11

Untuk Kegiatan dalam metode oncreate sisipkan baris di bawah ini

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

dan untuk fragmen dalam metode onCreate-nya

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

Ada 3 langkah yang harus diikuti untuk menggulir layar ke atas.

  1. Tulis dalam file manifes untuk aktivitas Anda:

android: windowSoftInputMode = "adjustResize"

  1. Tambahkan baris berikut dalam metode oncreate () aktivitas Anda

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Kemudian tempatkan seluruh tampilan Anda di "Scrollview" dalam file XML seperti:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Jangan lupa untuk menambahkan android: layout_gravity = "center" di layout Relatif induk.


8
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Tambahkan NestedScrollView di sekitar tata letak yang ingin Anda gulir, ini akan bekerja dengan sempurna


6

Saya mencoba metode Diego Ramírez, berhasil. Di AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Dalam activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

3

Saya telah menemukan solusi untuk masalah saya yang hampir sama dengan masalah Anda.

Pertama-tama, saya hanya memiliki LinearLayout dengan 2 elemen, ImageView dan LinearLayout yang berisi 2 EditText dan satu Tombol, jadi saya perlu memisahkannya dalam layar penuh tanpa keyboard, dan ketika keyboard muncul, mereka harus melihat lebih dekat.

Jadi saya menambahkan tampilan di antara mereka dengan atribut height di 0dp dan weight 1, yang memungkinkan saya memisahkan pandangan saya satu sama lain. dan ketika keyboard muncul, karena tidak memiliki ketinggian yang tetap, mereka hanya mengubah ukuran dan mempertahankan aspeknya.

Voila! Perubahan ukuran tata letak dan jarak antara pandangan saya sama saat keyboard ada atau tidak.


7
Mengapa Anda tidak memposting kode, untuk pemahaman yang lebih baik?
johnkarka

Saya memposting kode contoh di atas: stackoverflow.com/a/31994697/2914140 .
CoolMind

Anda dapat melakukannya dengan cara yang tidak terlalu rumit dengan menggunakan ConstraintLayoutdan menyematkan bagian atas ke atas dan bagian bawah ke bawah. Ketika keyboard terbuka, ukurannya secara alami akan berubah dengan menekan ruang di tengah (jika Anda menggunakan adjustResize)
hmac

2
  1. Jika pengguna menginginkan tugas ini menggunakan manifes, tambahkan baris ini dalam manifes
  2. Dalam manifes tambahkan baris ini: - android: windowSoftInputMode = "adjustPan" mis

Di File Java atau File Kotlin (Secara Terprogram): - Jika pengguna menginginkan ini menggunakan Activity, tambahkan baris di bawah ini dalam Metode onCreate

activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

Hai dan selamat datang di stackoverflow, dan terima kasih atas jawabannya. Daripada hanya memposting blok kode, dapatkah Anda memberikan penjelasan singkat tentang masalah apa yang telah Anda selesaikan dan bagaimana Anda mengatasinya? Ini akan membantu orang-orang yang menemukan pertanyaan ini di masa mendatang untuk lebih memahami masalah dan cara menanganinya.
Plutian

1

Berikut adalah kode manifes lengkap

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

jika Anda berada dalam fragmen maka Anda harus menambahkan kode di bawah ini ke onCreate Anda pada aktivitas Anda itu menyelesaikan masalah bagi saya

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

Dalam file manifes Anda tambahkan baris di bawah ini. Ini akan berhasil

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

Saya baru saja menambahkan baris berikut ke tata letak tingkat atas dan semuanya berfungsi:

android:fitsSystemWindows="true"

@ yash786 mungkin menampilkan tombol di bawah teks edit yang menerima fokus? Pertanyaan kedua, bisakah Anda membagikan file tata letak atau menjawab saya bagaimana Anda menambahkan teks edit di bagian atas keybord?
Heroes84

ini berfungsi untuk saya acara tanpa android: windowSoftInputMode = "stateVisible | adjustResize"
zoom

0

Baiklah ini sudah sangat terlambat namun saya telah menemukan bahwa jika Anda menambahkan Tampilan Daftar di bawah teks edit Anda maka keyboard akan memindahkan semua tata letak di bawah teks editan itu tanpa memindahkan ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Ini adalah satu-satunya solusi yang berhasil untuk saya.


0

Tidak ada satu saran pun yang menyelesaikan masalah saya. Sesuaikan Pan hampir sama seperti pekerjaan Sesuaikan Ubah Ukuran . Jika saya mengatur Adjust Nothing than layout tidak bergerak ke atas tetapi menyembunyikan teks editan saya dari bawah yang saya tulis dengan benar. Jadi setelah 24 jam pencarian terus menerus, saya menemukan sumber ini dan itu menyelesaikan masalah saya.


0

Mungkin terlambat tapi saya ingin menambahkan beberapa hal. Di Android Studio Versi 4.0.1, dan Gradle Versi 6.1.1, windowSoftInputMode ini tidak akan berfungsi seperti yang diharapkan jika Anda menambahkan tanda berikut dalam Aktivitas Anda:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Setelah membuang banyak waktu, saya menemukan peretasan itu. Agar adjustResizeatau AdjustPanatau atribut apa pun dari windowSoftInputModeberfungsi dengan baik, Anda harus menghapusnya dari aktivitas Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.