Soru Aktivite başlangıcında odağı kazanmak için EditText'i durdurun


Benim bir Activity Android'de iki öğe ile:

  1. EditText 
  2. ListView

Ne zaman benim Activity başlar, EditText Hemen giriş odaklıdır (yanıp sönen imleç). Başlangıçta giriş kontrolüne sahip olmak için kontrol istemiyorum. Denedim:

EditText.setSelected(false);

Şanssız. Nasıl ikna edebilirim EditText ne zaman kendini seçmek Activity başlar?


2390
2017-10-12 15:03


Menşei


Aşağıdaki upvoted hack herhangi birini kullanmadan önce <requestFocus /> XML düzeninizde satır (daha fazla ayrıntı @ floydaddict'ın cevabı). Eclipse'in WYSIWYG editörü otomatik olarak ekler. Bu çizgiyi kaldırdıktan sonra sorun benim için ortadan kayboldu. - DzinX
sadece kaldırarak <requestFocus /> Asus Nexus 7 üzerinde KitKat 4.4.4 ile çalışmadı ama @ Joe'nun cevapları işe yaradı - user13267
Sadece android: focusableInTouchMode = ana düzende "true" kullanıyorum ve benim için çalışıyor. - Herman
Benim için çalışan tek kişi, rallat'ın çözümüydi. - vivoconunxino
@Herman teşekkürler! basit çözümün benim için çalıştı - Adiyat Mubarak


Cevaplar:


Luc ve Mark mükemmel cevaplar ancak iyi bir kod örneği eksik. Etiketi ekleme android:focusableInTouchMode="true" için <LinearLayout> Aşağıdaki örnekte olduğu gibi sorunu çözecektir.

<!-- 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"/>

2032
2017-11-02 15:49



Ayarlamaya ne dersiniz ebeveyn düzeni android:focusableInTouchMode="true"! - Muhammad Babar
Mükemmel! Teşekkürler ... Unutulmaması gereken bir şey, kukla öğenin odaklanılabilir öğeden ÖNCE YERLEŞTİRİLMELİDİR !!! Kukla ve EditText arasında bir TextView vardı ve yöntem işe yaramadı! - maddob
android: focusableInTouchMode = ana düzen için "true" ayarı iyi bir yaklaşım oldu: @Muhammad Babar - sujith s
Birisi bunun neden işe yaradığını açıklayabilir mi? - Pietro Rea
@PietroRea Android, uygulama yapısının ana davranışına yerleştirilmiş can sıkıcı otomatik odaklama davranışlarına sahiptir. Bir düzenleme metninin odağı serbest bıraktığını veya kaybedeceğini söylerseniz, odaklamanın nereye gittiğine karar verir. Odaklanmaya odaklanmak için yeni bir nesne olmaksızın, ilk odaklanabilen öğeyi, o öğe yalnızca odağını temizlediğinde bile düzende seçer! Bu biraz deli ve sinir bozucu, ama belki bu tür davranışlar için geçerli bir sebep var. - Weston Wedding


Asıl sorun, sadece onun odaklanmasını istemediğini mi? Ya da sanal klavyenin odaklanmasının bir sonucu olarak gösterilmesini istemezsiniz. EditText? Gerçekten bir sorun görmüyorum EditText Başlangıçta odaklanmak, ancak kullanıcı açıkça odaklanmak istemediğinde softInput penceresini açmak kesinlikle bir problemdir. EditText (ve sonuç olarak klavyeyi açın).

Sanal klavyenin problemi ise, bkz. AndroidManifest.xml  <etkinlik> öğesi dokümantasyon.

android:windowSoftInputMode="stateHidden" - Aktiviteye girerken daima gizleyin.

veya android:windowSoftInputMode="stateUnchanged" - onu değiştirmeyin (ör. göstermek Henüz gösterilmemişse, ancak etkinliğe girerken açıksa, açık bırakın).


1567
2018-04-09 21:22



Yine de, klavyenin gösterilmemesine rağmen, imleç düzende ilk EditText'indedir. - martyglaubitz
@Anderson: Cevap hakkında hiçbir şey, bunun engelleneceğini ima etti. EditText odaklanmaktan. Aslında açıkça bunun nasıl engellendiğini açıklıyor. yazılım klavyesi IME otomatik olarak odaktan açılmaktan; çünkü büyük endişenin, beklenmedik şekilde ortaya çıkan yumuşak klavye olması daha olasıdır. değil odak kendini. Sorununuz EditText Aslında hiç odaklanma, sonra başka birinin cevabını kullan. - Joe
programlı olarak ayarlayın: stackoverflow.com/questions/6138330/... - Nick Franceschina
Bunu bir kamera ile bir aktivitede yapmayın - flaşın zamanlamasını keser (bana neden sorma) - Daniel Wilson
Başlangıçta odaklanma olmaması için bir neden, imeOptions değiştirilirse sonra Görünümde odak var ve klavye gösteriyor, imeOptions değişimden önce ayarlananlar olacak. - n_b


Daha basit bir çözüm var. Bu özellikleri ebeveyn düzeninizde ayarlayın:

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

Ve şimdi, etkinlik başladığında bu ana düzen varsayılan olarak odaklanacaktır.

Ayrıca, odağı ana çalışma düzenine yeniden vererek, çalışma sırasında çocuk görüntülerinden odağı kaldırabiliriz (ör., Çocuk düzenlemeyi bitirdikten sonra):

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

İyi yorum itibaren Guillaume Perrot:

android:descendantFocusability="beforeDescendants" gibi görünüyor   varsayılan (tam sayı 0'dır). Sadece ekleyerek çalışır    android:focusableInTouchMode="true".

Gerçekten, bunu görebiliriz. beforeDescendants varsayılan olarak ayarlanmış ViewGroup.initViewGroup() yöntem (Android 2.2.2). Ancak 0'a eşit değil. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Guillaume'e teşekkürler.


1014
2017-12-26 23:35



Bu öznitelikleri direkt Faaliyet oluşturmaya odaklanan görünümün ana öğesi, aksi takdirde işe yaramaz. - tomrozb
Ebeveyn bir ScrollView ise bu işe yaramazsa Not - Daniel Wilson
Sadece mükemmel bir çözüm. Her ikisi için de çalışır: 1. Otomatik netlemeyi etkinleştirme ve 2. Yumuşak klavyenin otomatik açılmasını devre dışı bırak - Meet
Güzel. Doğrudan bir ebeveyn olması gerekmez. Bunu düzenimin kök düzeyinde ayarladım ve işe yaramaz gibi görünüyor. - Kurotsuki
@DanielWilson, edittext dosyasının doğrudan üst öğesi olarak ne zaman bir kaydırma görünümü istersiniz? - Mark Buikema


Bulduğum tek çözüm:

  • Oluşturmak LinearLayout (Diğer Layout'ların çalışacağı takdirde bilmiyorum)
  • Öznitelikleri ayarla android:focusable="true" ve android:focusableInTouchMode="true"

Ve EditText etkinliği başlattıktan sonra odaklanmayacak


386
2017-10-23 08:12



Basit!! Bu özellikleri ilk olarak başarısız olan ana görünüme ekledim, sonra bunları başka bir düzende ayarladım ve iyi çalıştı. Teşekkürler!! - Rino
RelativeLayout ile de çalışır. - Brian Reinhold


Sorun sadece içinde görebileceğim bir mülkten geliyor gibi görünüyor. XML form düzenin

Bu satırın, bildirimin sonundaki EditText XML etiketleri:

<requestFocus />

Bu böyle bir şey vermeli:

<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





Diğer posterler tarafından sağlanan bilgileri kullanarak aşağıdaki çözümü kullandım:

XML düzeninde

<!-- 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"/>

onCreate () içinde

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

ve sonunda, onResume () içinde

@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





Aşağıdakiler edittext'in oluşturulduğu zaman odağı almasını engeller, ancak onlara dokunduğunuzda yakalayın.

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

Bu nedenle, xml'de false olarak ayarlanabilecek şekilde ayarlanırsınız, ancak aşağıdaki javada, aşağıdaki dinleyiciyi eklersiniz:

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

Yanlış döndüğünüzden, yani olayı tüketmediğiniz için, odaklama davranışı normal gibi devam edecektir.


58
2018-06-15 04:45



Ama bu asla gelecekte odaklanmayacak, sadece başlangıç ​​için odaklamayı nasıl durduracağız (aktivite başlangıcı)? - Jayesh
OnTouchListener, diğer dokunma eylemlerinden önce çağrılır. Böylece, odaklanabilirliği dokunarak etkinleştirerek standart dokunuş ilk dokunuşta gerçekleşir. Klavye çıkacak ve her şey. - MinceMan
Bunu yapmanın en iyi yolu bence. Ayrıca, yukarıdaki mumbo-jumbo xml sihirli kukla kodu, düzenleme metinleri karmaşık bir dizi için işe yaramadı ... Bu çalışırsa, kesinlikle oy vereceğim. - Radu
Ancak birden fazla düzenleme metni kullanıyorsanız, bir sonraki düzenleme metnine odaklanır ve klavye açılarak eklenecek daha iyidir. android: windowSoftInputMode = "stateAlwaysHidden" belirli bir etkinlik için tezahür eder. - Karan sharma
Not: Android P'de sistem artık bir varsayılan odağı yakalamayacaktır. Bu, bu hack'ın P ile başlayarak gerekli olmadığı anlamına gelir. - MinceMan


Deneyin clearFocus () yerine setSelected(false). Android'deki her görünümün hem odaklanabilirliği hem de seçilebilirliği var ve ben sadece odağı temizlemek istediğinizi düşünüyorum.


54
2017-10-12 19:02



Bu umut verici görünüyor, ancak Etkinlik yaşam döngüsünün hangi noktada çağrılması gerekiyor? OnCreate () içinde çağırırsam, EditText hala odaklanır. OnResume () veya başka bir yerde çağrılmalıdır? Teşekkürler! - Mark
Kabul edilen cevabı bu cevapla birleştirdim. aradım myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); içinde onResume Faaliyetin Bu, EditText'in telefon döndürüldüğünde odağı tutmasını sağladı. - teedyay


Tek başına serval cevabı denedim ancak odak hala EditText'te. Ben sadece yukarıdaki iki çözümü birlikte kullanarak çözmeyi başarabilirim.

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

(Gümüş Referansı https://stackoverflow.com/a/8639921/15695 )

ve kaldır

 <requestFocus />

EditText'te

(Floydaddict referansı https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32



Çalışmak için yukarıdakilere ek olarak edittext.clearFocus () eklemeliydim :) - Nav


Bu çözümlerin hiçbiri benim için işe yaramadı. Otomatik netlemeyi çözme şeklim:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

37
2017-11-30 16:37



android: windowSoftInputMode = Android Manifest'teki herhangi bir etkinlikte "adjustPan" - rallat
Bunu nasıl anladığınızdan emin değilsiniz, ama kudos kardeşim! Bu çalışıyor. - portfoliobuilder


Basit bir çözüm: İçinde AndroidManifest içinde Activity etiket kullanımı

android:windowSoftInputMode="stateAlwaysHidden"

31
2018-03-17 15:42



Kesin olarak, bu sorunu çözmez. OP şunları söyledi: "Başlangıçta giriş kontrolüne sahip olmak için herhangi bir kontrolün olmasını istemiyorum." Çözümünüz sadece klavyeyi gizler, bu da en küçük bir farktır. - katzenhut
En iyi çözüm! Yukarıdaki çözümden bilinen çözüm benim için çalıştı. bu küçük şey hakkında yaklaşık bir saat harcadı - Hamza Zaidi
@katzenhut evet, bu cevap tam olarak benim sorunum. Edittext'ime odaklanmak bir PlaceAutoComplete etkinliği açıyor, bu yüzden bu cevap eksik - Zach
Soru şu olursa, bu cevap tamamlanmış olur: Her zaman aktivitemin bir klavye göstermediğinden nasıl emin olabilirim? Hangisi değil? - Martin Marconcini