Pertanyaan Hentikan EditText dari mendapatkan fokus pada Kegiatan startup


Saya punya Activity di Android, dengan dua elemen:

  1. EditText 
  2. ListView

Ketika saya Activity dimulai, EditText segera memiliki fokus input (mem-flash kursor). Saya tidak ingin ada kontrol untuk memiliki fokus input saat startup. Saya mencoba:

EditText.setSelected(false);

Tidak beruntung. Bagaimana saya bisa meyakinkan EditText untuk tidak memilih dirinya sendiri ketika Activity dimulai?


2386
2017-10-12 15:03


asal


Jawaban:


Jawaban yang sangat baik dari Luc dan Mark namun contoh kode yang baik tidak ada. Menambahkan tag android:focusableInTouchMode="true" untuk <LinearLayout> seperti contoh berikut akan memperbaiki masalah.

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>

2026
2017-11-02 15:49



Apakah masalah yang sebenarnya Anda tidak ingin memiliki fokus sama sekali? Atau Anda tidak ingin menunjukkan keyboard virtual sebagai akibat dari pemfokusan EditText? Saya tidak benar-benar melihat masalah dengan EditText memiliki fokus pada permulaan, tetapi jelas merupakan masalah untuk membuka jendela softInput ketika pengguna tidak secara eksplisit meminta untuk fokus pada EditText (dan buka keyboard sebagai hasilnya).

Jika itu masalah keyboard virtual, lihat AndroidManifest.xml  elemen <activity> dokumentasi.

android:windowSoftInputMode="stateHidden" - selalu sembunyikan saat memasuki aktivitas.

atau android:windowSoftInputMode="stateUnchanged" - jangan mengubahnya (misalnya tidak menunjukkan itu jika belum ditampilkan, tetapi jika terbuka saat memasuki aktivitas, biarkan terbuka).


1565
2018-04-09 21:22



Solusi yang lebih sederhana ada. Setel atribut ini di layout induk Anda:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

Dan sekarang, ketika aktivitas memulai tata letak utama ini akan mendapatkan fokus secara default.

Selain itu, kami dapat menghapus fokus dari tampilan anak saat waktu proses (mis., Setelah menyelesaikan pengeditan anak) dengan memberikan fokus ke tata letak utama lagi, seperti ini:

findViewById(R.id.mainLayout).requestFocus();

Komentar yang bagus dari Guillaume Perrot:

android:descendantFocusability="beforeDescendants" tampaknya menjadi   default (nilai integer adalah 0). Ia bekerja hanya dengan menambahkan    android:focusableInTouchMode="true".

Sungguh, kita dapat melihat bahwa beforeDescendants disetel sebagai default di ViewGroup.initViewGroup() metode (Android 2.2.2). Tapi tidak sama dengan 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Terima kasih untuk Guillaume.


1012
2017-12-26 23:35



Satu-satunya solusi yang saya temukan adalah:

  • Membuat LinearLayout (Saya tidak tahu apakah jenis lain dari Layout akan bekerja)
  • Atur atribut android:focusable="true" dan android:focusableInTouchMode="true"

Dan itu EditText tidak akan mendapatkan fokus setelah memulai aktivitas


385
2017-10-23 08:12



Masalahnya tampaknya berasal dari properti yang hanya bisa saya lihat di XML form dari tata letak.

Pastikan untuk menghapus baris ini pada akhir deklarasi di dalam EditText Tag XML:

<requestFocus />

Itu harus memberikan sesuatu seperti itu:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

67
2018-03-13 09:57



menggunakan informasi yang diberikan oleh poster lain, saya menggunakan solusi berikut:

dalam tata letak XML

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

di onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

dan akhirnya, di onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

63
2018-05-26 21:07



Hal-hal berikut ini akan menghentikan penggunaan teks saat mengambil fokus ketika dibuat, tetapi ambil ketika Anda menyentuh mereka.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Jadi Anda mengatur fokus ke false di xml, tetapi kuncinya ada di java, yang Anda tambahkan pendengar berikut:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Karena Anda mengembalikan salah, yaitu tidak mengonsumsi acara, perilaku pemfokusan akan berjalan seperti biasa.


58
2018-06-15 04:45



Mencoba clearFocus () dari pada setSelected(false). Setiap tampilan di Android memiliki fokus dan kesesuaian, dan saya pikir Anda hanya ingin membersihkan fokus.


54
2017-10-12 19:02



Saya telah mencoba jawaban serval secara individual tetapi fokusnya masih di EditText. Saya hanya berhasil menyelesaikannya dengan menggunakan dua solusi di atas bersama-sama.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Referensi dari Silver https://stackoverflow.com/a/8639921/15695 )

dan hapus

 <requestFocus />

di EditText

(Referensi dari floydaddict https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32