Menonaktifkan tampilan pengeditan layar penuh untuk input keyboard lunak di lanskap?

237

Pada perangkat Android yang menggunakan papan ketik lunak, saya ingin mencegah tampilan pengeditan papan ketik layar penuh (ditampilkan di bawah) muncul ketika dalam mode lansekap (yaitu, saya hanya ingin melihat papan ketik itu sendiri dan pandangan saya di belakangnya).

Saya berasumsi ini dapat dicapai menggunakan setExtractViewShown(false)metode aktif InputMethodService, tetapi saya tidak dapat mengakses contoh default ini dan tidak ingin menerapkan metode input khusus.

Tampilan pengeditan layar penuh Android

Diedit untuk menambahkan: tampilan yang akan dituju bukan TextView( Viewdengan InputConnectionpenerapan kustom ), jadi android:imeOptions="flagNoExtractUi"tidak akan berfungsi di sini.

jnic
sumber
Mari kita coba melihatnya. Itu bagus untuk Anda. [Lihat yang ini] [1] [1]: stackoverflow.com/questions/8648401/…
sonida
saya punya masalah yang sama :( Anda mungkin punya ide? stackoverflow.com/questions/36914290/…
railwanderer
2
cara menerapkan ini di seluruh aplikasi. Kami tidak akan menambahkan nilai atribut di setiap edittext dalam xml.
Vikas Pandey
2
Banyak jawaban di bawah ini merekomendasikan penggunaan flagNoExtractUiatau IME_FLAG_NO_EXTRACT_UI. Namun, dalam dokumentasi untuk IME_FLAG_NO_EXTRACT_UI, yang sesuai dengan flagNoExtractUi, itu menyatakan bahwa "Menggunakan flag ini tidak disarankan dan mungkin menjadi usang di masa depan", jadi flagNoFullscreenadalah opsi yang disarankan.
ThomasW

Jawaban:

178

Saya akhirnya menjawab pertanyaan saya sendiri:

Ekstrak UI (yaitu mode pengeditan layar penuh) dapat dinonaktifkan pada titik di mana koneksi input dihubungkan:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
jnic
sumber
215
cukup masukkan saja file xml android Anda: imeOptions = "flagNoExtractUi"
1
jnic, di mana Anda melakukannya pada kode keyboard lunak? SoftKeyboard.java? Saya mencoba menimpa dan kesalahan yang sama keluar.
14
Anda mungkin ingin menambahkan bendera ke opsi alih-alih menimpa opsi apa yang pernah diteruskan seperti ini:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 cara menerapkan atribut ini pada item kotak pencarian di bilah tindakan?
Menna-Allah Sami
1
Satu-satunya hal yang berfungsi saat menggunakan Tampilan kustom untuk menangani keyboard. Terima kasih!
Herman
109

Untuk melakukannya, navigasikan ke aktivitas xml dan rekatkan android:imeOptions="flagNoExtractUi"dalam kode Anda. Tapi di mana harus ditempelkan? Lihat kode contoh aktivitas xml dan lihat pada EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"         
    >

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

Jika Anda ingin lebih banyak opsi penyesuaian untuk keyboard, lihat http://developer.android.com/guide/topics/ui/controls/text.html

pbaranski
sumber
64

tambahkan properti android:imeOptions="flagNoExtractUi"ke masing-masing EditTextdalam XMLfile Anda .

Michael Yaworski
sumber
1
Jawaban ini terlalu pendek dan tidak memenuhi standar kualitas SO. Harap perbaiki dengan menambahkan beberapa penjelasan tambahan, sehingga akan bermanfaat bagi komunitas dan tidak hanya untuk OP.
Lorenzo Donati - Codidact.org
31
@LorenzoDonati itu persis apa yang harus Anda lakukan ... itu adalah jawaban yang sangat sederhana karena solusinya sangat sederhana dan itu hanya cara yang berbeda untuk melakukannya daripada jawaban di atas. Juga, jawaban tidak boleh "terlalu pendek" kecuali mereka tidak menjawab pertanyaan, IMO.
Michael Yaworski
1
Maaf, tapi ini bukan apa yang dipikirkan komunitas SO tentang hal itu. Jawabannya tidak harus terbatas untuk memecahkan masalah OP, mereka harus menjadi jawaban yang bagus secara umum. Lihat ini dan ini , misalnya.
Lorenzo Donati - Codidact.org
22
@LorenzoDonati itu adalah pertanyaan yang sangat spesifik dengan hanya satu hasil akhir (tetapi banyak cara untuk menyelesaikannya). Jawaban saya adalah tambahan untuk jawaban lain di halaman ini. SEMUA jawaban di halaman ini hanya terbatas pada "masalah OP" karena itulah satu-satunya jawaban yang dapat ditulis. Seperti yang saya katakan, ini spesifik dan sederhana.
Michael Yaworski
2
akhirnya, saya menemukan jawabannya. terima kasih banyak @mike yaworski
Drx
53

Jawaban di atas membantu saya mencari solusi untuk EditText yang ditambahkan secara dinamis:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Abdo
sumber
37

Gunakan android:imeOptions="flagNoFullscreen"untuk mencapai fitur itu.

Ridoy
sumber
1
pendekatan yang bagus dan lebih baik untuk menulis dalam xml. Bekerja untukku. Terima kasih
Ahesanali Suthar
1
Perhatikan bahwa dalam dokumentasi untuk IME_FLAG_NO_EXTRACT_UI, yang sesuai dengan flagNoExtractUi, itu menyatakan bahwa "Menggunakan flag ini tidak disarankan dan mungkin menjadi usang di masa depan", jadi flagNoFullscreenadalah opsi yang disarankan.
ThomasW
12

Selain itu, jika Anda ingin menggabungkan beberapa programatik imeOptions, Anda dapat menggunakan | sintaksis.

Misalnya, untuk menonaktifkan tampilan edit layar penuh dalam lanskap dan mengganti kunci "Berikutnya" dengan "OK" (ACTION_DONE) di keyboard, Anda dapat menggunakan:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Maxime Ancelin
sumber
9

Jika Anda memodifikasi IME secara langsung, Anda dapat mencegahnya menampilkan ExtractedView dengan menimpa onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
ObsidianX
sumber
6

Saya tahu ini agak terlambat, tetapi bagi siapa saja yang masih tertarik, inilah solusinya: Dalam kasus saya, saya memiliki aktivitas lanskap yang berisi EditText di atasnya dan saya perlu menerapkan fitur pelengkapan otomatis dalam Kegiatan pencarian ini , yang tumpang tindih keyboard menyebabkan masalah bahwa pengguna tidak dapat melihat hasil RecyclerView . Jadi saya akhirnya memiliki EditText ini di tata letak saya:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

Bersulang!

Arefeh Iravanchi
sumber
5

Solusi saya:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
dastan
sumber
Ini adalah jawaban yang lebih mutakhir.
alierdogan7
2

Kamu bisa memakai :

android:imeOptions="flagNoFullscreen" 

di edittext Anda

Thientvse
sumber
1
Apakah ini jawaban?
artgb
Saya mencobanya dan itu bekerja untuk saya! (Perangkat saya android 4.1.2)
Thientvse
0

Anda dapat menelepon untuk menyembunyikan keyboard lunak dan menghapus fokus dari tampilan pencarian.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();
mohamed elagamy
sumber