Bir düzen oluşturulduğunda ve görüntülendiğinde bir görünüme nasıl odaklanılır?


90

Şu anda, a Button, a TextViewve an içeren bir düzenim var EditText. Düzen görüntülendiğinde, odak EditText, klavyenin Android telefonda görünmesini tetikleyecek şekilde otomatik olarak üzerine getirilecektir . İstediğim bu değil. TextViewBir düzen görüntülenirken odağı ayarlayıp hiçbir şey yapmamamın bir yolu var mı ?

Yanıtlar:


109

Odağı belirleyin: Çerçeve, kullanıcı girdisine yanıt olarak hareketli odağı ele alacaktır. Odağı belirli bir görünüme zorlamak için requestFocus () çağrısı yapın


17

Bu çalışıyor:

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

Bu ne işe yarıyor? Görünüşe göre, tüm faaliyet için bir durumu değiştiriyor, sadece bir görünüm veya parça değil, bu yüzden bu konuda dikkatli olurum ve tüm sonuçlarını anlamadan onu kullanmam.
Kartick Vaddadi

Aslında, bunu orijinal göndericinin isteğine dayanarak yapmam. Bu, mevcut sorunu çözebilir, ancak onu kullanmanın daha sonra sorunlara neden olabilecek yan etkileri vardır. Bunun gibi hackler kod tabanlarına girerek daha sonra orijinal hack'i geçersiz kılmak için başka hack'lerin eklenmesine neden oluyor ... kısır döngü devam ediyor ... ve insanlar kodun neden sürdürülemez hale geldiğini merak ediyor. Evet, tahmin ettiniz .... Böyle şeyler yapan başkalarıyla çalışıyorum ve bu benim hayatımı çok zorlaştırıyor.
dell116


6

Ayarlamak

 android:focusable="true"

senin içinde <EditText/>


6

Odağı ayarlamak için, bir İşleyici kullanarak requestFocus () işlemini geciktirin.

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();
          } 
       }
     );
   }
}

5

Sadece klavyeyi gizlemeyi deneyebilirsiniz. Bunun gibi bir şey:

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


3

Bu satırları da OnResumeolarak ayarlayın ve focusableInTouchkontrollerinizi başlatırken doğru olarak ayarlandığından emin olun .

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

odağı değiştirmek için xml'deki textView'u odaklanabilir yapın

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

ve java'da oluşturmada

textView.requestFocus();

veya sadece klavyeyi gizleyin

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android: focusable = "true" ve textView.requestFocus (); benim için çalıştı. Teşekkürler!
Werner

2

Yukarıdaki cevapların hiçbiri benim için işe yaramıyor. Sadece (diyelim diyelim ki) çözümü ilk değiştirmeye olmuştur TextView bir de özürlü EditText odağı alır ve sonra eklemek

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

Klavyenin gösterilmesini önlemek için onCreate geri aramasında . Şimdi ilk EditText'im bir TextView gibi görünüyor, ancak sonunda ilk odağı alabilir.


2

Son öneri doğru çözümdür. Tekrarlamak için, önce android:focusable="true"mizanpaj xmldosyasında, ardından requestFocus()kodunuzun görünümünde ayarlayın.


1

Metin görünümünün odaklanılamayacağını düşünüyorum. Odağı örneğin bir düğmeye ayarlamaya veya odaklanabilir özelliği true olarak ayarlamaya çalışın.


1

ur xml'deki ilk kontrol olarak "0 dip" boyutunda bir düzenleme metni ekleyebilirsiniz, böylece render üzerinde odaklanılır. (odaklanabilir olduğundan ve tümünün ...)


1

Dosyanızdaki android:windowSoftInputModeaktivitenize ekleyerek başlayabilirsiniz AndroidManifest.xml.

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

Bu, klavyenin görünmemesini sağlar, ancak EditTextyine de odaklanır. Bunu çözmek için, kök görünümünüzde android:focusableInTouchmodeve android:focusableolarak ayarlayabilirsiniz true.

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

Yukarıdaki kod RelativeLayout, bunun yerine odaklanılmasını sağlayacaktır.EditText


0

Odak, dokunmanın yanı sıra bir şey (örneğin bir d-pad, klavye vb.) Kullanırken UI bileşenlerini seçmek içindir. Bazıları varsayılan olarak odaklanabilir olmasa da herhangi bir görünüm odak alabilir. (Bir görünümü odaklanabilir hale getirebilir setFocusable(true)ve odaklanmaya zorlayabilirsiniz requestFocus().)

Ancak, dokunma modundayken odaklamanın devre dışı bırakıldığını unutmamak önemlidir . Dolayısıyla, parmaklarınızı kullanıyorsanız, odağı programlı olarak değiştirmek hiçbir şey yapmaz. Bunun istisnası, bir girdi düzenleyiciden girdi alan görünümler içindir. An EditTextböyle bir örnektir. Bu özel durum setFocusableInTouchMode(true)için, yazılım klavyesinin girişin nereye gönderileceğini bilmesini sağlamak için kullanılır. An EditText, varsayılan olarak bu ayara sahiptir. Yazılım klavyesi otomatik olarak açılacaktır.

Yazılım klavyesinin otomatik olarak açılmasını istemiyorsanız, @abeljus'un belirttiği gibi onu geçici olarak bastırabilirsiniz:

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

Bir kullanıcı tıkladığında, EditTextyine de klavyeyi göstermelidir.

Daha fazla okuma:


Bu cevap yanlış mı? Olumsuz oyla yorum yapılmadı.
Suragch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.