Bagaimana cara mengatur fokus pada tampilan saat tata letak dibuat dan ditampilkan?

90

Saat ini, saya memiliki layout yang berisi a Button, a TextViewdan an EditText. Saat tata letak ditampilkan, fokus akan secara otomatis diletakkan di EditText, yang akan memicu keyboard untuk muncul di ponsel Android. Bukan itu yang saya inginkan. Adakah cara agar saya bisa mengatur fokus TextViewatau tidak ada saat tata letak ditampilkan?

pengguna256239
sumber

Jawaban:

109

Tetapkan fokus: Framework akan menangani pemindahan fokus sebagai respons terhadap masukan pengguna. Untuk memaksa fokus ke tampilan tertentu, panggil requestFocus ()

Mark B
sumber
17

Ini bekerja:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Charles Mosndup
sumber
Apa fungsinya? Sepertinya ini mengubah beberapa status untuk seluruh aktivitas, dan bukan hanya tampilan atau fragmen, jadi saya akan berhati-hati tentang ini, dan tidak menggunakannya kecuali saya memahami semua implikasinya.
Kartick Vaddadi
Memang saya tidak akan melakukan ini berdasarkan permintaan poster asli. Ini dapat menyelesaikan masalah saat ini, tetapi menggunakannya memiliki efek samping yang dapat menyebabkan masalah di kemudian hari. Peretasan seperti inilah yang masuk ke dalam basis kode yang menyebabkan peretasan lain ditambahkan kemudian untuk meniadakan peretasan asli .. lingkaran setan terus berlanjut .... dan orang-orang bertanya-tanya mengapa kode menjadi tidak dapat dipertahankan. Ya, Anda dapat menebaknya .... Saya bekerja dengan orang lain yang melakukan hal-hal seperti ini dan itu membuat hidup saya sangat sulit.
dell116
6

Anda harus menambahkan ini:

android:focusableInTouchMode="true"
arif jusoh
sumber
6

Set

 android:focusable="true"

di Anda <EditText/>

ravi
sumber
6

Untuk menyetel fokus, tunda requestFocus () menggunakan Handler.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}
Dan McNerthney
sumber
5

Anda dapat mencoba menyembunyikan keyboard. Sesuatu seperti ini:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
abeljus
sumber
3

Mencoba

comp.requestFocusInWindow();
JARC
sumber
3

Setel baris ini OnResumejuga dan pastikan jika focusableInTouchdisetel ke true saat Anda menginisialisasi kontrol Anda

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Pawan Maheshwari
sumber
3

untuk mengubah fokus, buat textView di xml bisa difokuskan

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

dan di java di buat

textView.requestFocus();

atau cukup sembunyikan keyboard

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}
Mina Shaker
sumber
android: focusable = "true" dan textView.requestFocus (); bekerja untuk saya. Terima kasih!
Werner
2

Tidak ada jawaban di atas yang cocok untuk saya. Satu-satunya solusi (katakanlah) adalah mengubah TextView pertama dalam EditText nonaktif yang menerima fokus dan kemudian menambahkan

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

di callback onCreate untuk mencegah keyboard ditampilkan. Sekarang EditText pertama saya terlihat seperti TextView tetapi akhirnya bisa mendapatkan fokus awal.

lorenzoff
sumber
2

Saran terakhir adalah solusi yang tepat. Sekadar mengulang, pertama setel android:focusable="true"di xmlfile layout , lalu requestFocus()di tampilan di kode Anda.

Reza Nezami
sumber
1

Saya pikir tampilan teks tidak bisa difokuskan. Cobalah untuk mengatur fokus pada sebuah tombol misalnya, atau untuk mengatur properti yang dapat difokuskan ke true.

lapakrette
sumber
1

Anda dapat menambahkan teks edit dengan ukuran "0 dip" sebagai kontrol pertama di ur xml, jadi, itu akan mendapatkan fokus pada render. (pastikan itu dapat difokuskan dan semua ...)

con_9
sumber
1

Anda dapat memulai dengan menambahkan android:windowSoftInputModeaktivitas Anda dalam AndroidManifest.xmlfile.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

Ini akan membuat keyboard tidak terlihat, tapi EditTexttetap fokus. Untuk mengatasinya, Anda dapat mengatur android:focusableInTouchmodedan android:focusableke truepada tampilan root Anda.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

Kode di atas akan memastikan yang RelativeLayoutmendapatkan fokus, bukanEditText

Uilque Messias
sumber
0

Fokus adalah untuk memilih komponen UI saat Anda menggunakan sesuatu selain sentuhan (mis., D-pad, keyboard, dll.). Setiap tampilan dapat menerima fokus, meskipun beberapa tidak dapat difokuskan secara default. (Anda dapat membuat tampilan setFocusable(true)dapat difokuskan dengan dan memaksanya untuk difokuskan requestFocus().)

Namun demikian, penting untuk diperhatikan bahwa saat Anda dalam mode sentuh, fokus dinonaktifkan . Jadi jika Anda menggunakan jari Anda, mengubah fokus secara terprogram tidak akan menghasilkan apa-apa. Pengecualian untuk ini adalah untuk tampilan yang menerima masukan dari editor masukan. Contohnya EditTextseperti itu. Untuk situasi khusus setFocusableInTouchMode(true)ini digunakan agar keyboard lunak tahu ke mana harus mengirim input. An EditTextmemiliki pengaturan ini secara default. Soft keyboard akan muncul secara otomatis.

Jika Anda tidak ingin soft keyboard muncul secara otomatis maka Anda dapat menekannya untuk sementara seperti yang dicatat @abeljus:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Namun, saat pengguna mengkliknya EditText, keyboard masih tetap ditampilkan.

Bacaan lebih lanjut:

Suragch
sumber
Apakah jawaban ini salah? Tidak ada komentar yang tersisa dengan suara negatif tersebut.
Suragch