Pytanie Zatrzymaj EditText przed skupieniem się na uruchomieniu działania


mam Activity w systemie Android, z dwoma elementami:

  1. EditText 
  2. ListView

Kiedy moja Activity zaczyna się EditText od razu ma fokus wejściowy (migający kursor). Nie chcę, aby jakakolwiek kontrola miała fokus wejściowy podczas uruchamiania. Próbowałem:

EditText.setSelected(false);

Brak szczęścia. Jak mogę przekonać EditText nie wybrać siebie, gdy Activity zaczyna się?


2390
2017-10-12 15:03


pochodzenie


Przed użyciem któregokolwiek z hacków upvoted poniżej, sprawdź, czy nie masz <requestFocus /> linia w układzie XML (więcej szczegółów w Odpowiedź @ floydaddict). Edytor WYSIWYG Eclipse dodaje go automatycznie. Po usunięciu tej linii problem zniknął dla mnie. - DzinX
usuwanie tylko <requestFocus /> nie działa na Asus Nexus 7 z KitKatem 4.4.4, ale działa odpowiedź Joe Joe - user13267
Po prostu używam Androida: focusableInTouchMode = "true" w moim układzie nadrzędnym i działa dla mnie. - Herman
Jedynym, który pracował dla mnie, było rozwiązanie rallata - vivoconunxino
@Herman dzięki!. Twoje proste rozwiązanie zadziałało u mnie - Adiyat Mubarak


Odpowiedzi:


Doskonałe odpowiedzi od Luc i Marka, jednak brakuje dobrej próbki kodu. Dodawanie tagu android:focusableInTouchMode="true" do <LinearLayout> jak poniższy przykład rozwiąże problem.

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



A co z ustawianiem rodzic układ do android:focusableInTouchMode="true"! - Muhammad Babar
Idealny! Dzięki ... Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że przedmiot fikcyjny musi zostać UMIESZCZONY PRAWEM PRZED elementem ogniskowym !!! Miałem TextView pomiędzy moim manekinem a EditTextem i metoda nie działała! - maddob
ustawienie android: focusableInTouchMode = "true" do układu nadrzędnego było dobrym podejściem dzięki @Muhammad Babar - sujith s
Czy ktoś może wyjaśnić, dlaczego to działa? - Pietro Rea
@PietroRea Android ma irytujące zachowania auto-focus, które są wbudowane w podstawowe zachowanie struktury aplikacji. Jeśli powiesz, że tekst edycji zwalnia lub traci ostrość, automatycznie podejmuje decyzję o tym, gdzie się skupi. Bez nowego obiektu, do którego zostanie przeniesiony fokus, wybiera pierwszy element, który można ustawić w polu, nawet jeśli ten element właśnie wyczyścił fokus! To trochę szalone i frustrujące, ale być może istnieje uzasadniony powód takiego zachowania. - Weston Wedding


Czy faktyczny problem polega na tym, że nie chcesz w ogóle koncentrować się na nim? Lub nie chcesz, aby wyświetlała wirtualną klawiaturę w wyniku fokusowania EditText? Naprawdę nie widzę problemu z EditText koncentrując się na starcie, ale zdecydowanie problemem jest otwarcie okna SoftInput, gdy użytkownik nie zażądał wyraźnego EditText (i otwórz klawiaturę w wyniku).

Jeśli jest to problem z wirtualną klawiaturą, zobacz AndroidManifest.xml  Element <activity> dokumentacja.

android:windowSoftInputMode="stateHidden" - zawsze ukrywaj go podczas wchodzenia do aktywności.

lub android:windowSoftInputMode="stateUnchanged" - nie zmieniaj tego (na przykład nie pokazać jeśli nie jest jeszcze pokazany, ale jeśli był otwarty podczas wchodzenia w działanie, zostaw to otwarte).


1567
2018-04-09 21:22



a mimo to kursor znajduje się w pierwszym EditText w układzie - nawet jeśli klawiatura nie jest wyświetlana - martyglaubitz
@Anderson: Nic na temat odpowiedzi nie sugerowało, że to uniemożliwi EditText od uzyskania ostrości. W rzeczywistości wyraźnie stwierdza, że ​​w ten sposób można zapobiec klawiatura programowa IME od automatycznego otwierania po ustawieniu ostrości; ponieważ jest bardziej prawdopodobne, że większym problemem jest niespodziewanie pojawienie się miękkiej klawiatury, nie samo skupienie. Jeśli Twój problem dotyczy EditText właściwie skupiając się na wszystkim, a następnie użyj czyjejś odpowiedzi. - Joe
ustawić programowo: stackoverflow.com/questions/6138330/... - Nick Franceschina
Nie rób tego na zajęciach z kamerą - powoduje to przerwanie timingu lampy błyskowej (nie pytaj mnie dlaczego) - Daniel Wilson
Jednym z powodów, aby nie skupiać się na uruchomieniu, jest to, że jeśli imeOptions są zmienione po widok ma ostrość i pokazy na klawiaturze, imeOptions będą tymi ustawionymi przed zmianą. - n_b


Istnieje prostsze rozwiązanie. Ustaw te atrybuty w układzie nadrzędnym:

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

A teraz, gdy aktywność się rozpocznie, główny układ zostanie domyślnie ustawiony.

Ponadto możemy usunąć fokus z widoków podrzędnych w środowisku wykonawczym (np. Po zakończeniu edycji podrzędnej), ponownie ustawiając fokus na główny układ, na przykład:

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

Dobry komentarz od Guillaume Perrot:

android:descendantFocusability="beforeDescendants" wydaje się być   default (wartość całkowita to 0). Działa tylko przez dodanie    android:focusableInTouchMode="true".

Naprawdę, widzimy, że beforeDescendants ustawione jako domyślne w ViewGroup.initViewGroup() metoda (Android 2.2.2). Ale nie równa się 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Dzięki Guillaume.


1014
2017-12-26 23:35



Ważne jest, aby ustawić te atrybuty na bezpośredni rodzic widoku, który koncentruje się na tworzeniu aktywności, w przeciwnym razie nie zadziała. - tomrozb
Zauważ, że to nie działa, jeśli rodzicem jest ScrollView - Daniel Wilson
Po prostu idealne rozwiązanie. Działa zarówno dla: 1. automatycznego ustawiania ostrości, jak i 2. wyłączania automatycznego otwierania miękkiej klawiatury - Meet
Miły. Nie musi to być bezpośredni rodzic. Ustawiłem go na poziomie katalogu głównego i wygląda na to, że działa dobrze. - Kurotsuki
@DanielWilson, kiedy chcesz przewijać jako bezpośredni rodzic edytora edittext? - Mark Buikema


Jedyne znalezione rozwiązanie to:

  • Stwórz LinearLayout (Nie wiem, czy będą działać inne rodzaje układów)
  • Ustaw atrybuty android:focusable="true" i android:focusableInTouchMode="true"

I EditText nie będzie koncentrować się po rozpoczęciu działania


386
2017-10-23 08:12



Prosty!! Początkowo dodałem te właściwości do widoku nadrzędnego, co nie powiodło się, a następnie ustawiłem je w innym układzie i działałem bez zarzutu. Dzięki!! - Rino
Działa również z RelativeLayout. - Brian Reinhold


Problem wydaje się pochodzić z właściwości, które widzę tylko w XML form układu.

Pamiętaj, aby usunąć ten wiersz na końcu deklaracji w EditText Tagi XML:

<requestFocus />

To powinno dać coś takiego:

<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





korzystając z informacji dostarczonych przez inne plakaty, skorzystałem z następującego rozwiązania:

w układzie 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"/>

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

i wreszcie, w 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





Poniższe czynności spowodują, że edittext nie będzie skupiał się na utworzeniu, ale chwyci go, gdy go dotkniesz.

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

Ustawiasz w pliku XML na wartość false, ale klucz znajduje się w java, do którego dodajesz następujący listener:

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

Ponieważ zwracasz wartość false, tj. Nie zużywasz zdarzenia, zachowanie skupienia będzie przebiegać tak jak zwykle.


58
2018-06-15 04:45



Ale to nigdy nie będzie koncentrować się w przyszłości, jak zatrzymać skupienie tylko na początku (rozpoczęcie działalności)? - Jayesh
OnTouchListener jest wywoływany przed innymi akcjami dotykowymi. Dzięki temu, że można ustawić ostrość na dotyk, standardowe ogniskowanie odbywa się za pierwszym dotknięciem. Klawiatura pojawi się i wszystko. - MinceMan
Myślę, że to najlepszy sposób na zrobienie tego. Ponadto powyższy kod magii mumbo-jumbo xml NIE działał dla złożonego zestawu tekstów edycyjnych ... Jeśli to zadziała, zdecydowanie zagłosuję. - Radu
Ale jeśli masz wiele tekstów do edycji, skupisz się na następnym tekście edycji i otworzysz klawiaturę, więc lepiej ją dodać android: windowSoftInputMode = "stateAlwaysHidden" w manifeście dla konkretnej działalności. - Karan sharma
Uwaga: w systemie Android P system nie będzie już przechwytywał domyślnego fokusa. Oznacza to, że ten hack nie jest konieczny zaczynając od P. - MinceMan


Próbować clearFocus () zamiast setSelected(false). Każdy widok w systemie Android ma zarówno możliwość ustawiania ostrości, jak i wybieralności, i myślę, że chcesz po prostu skupić uwagę.


54
2017-10-12 19:02



Brzmi obiecująco, ale w jakim momencie cyklu życia Aktywności powinno się go nazwać? Jeśli zadzwonię do on on onCreate (), EditText nadal ma fokus. Czy powinien on zostać wywołany onResume () lub w innej lokalizacji? Dzięki! - Mark
Połączyłem zaakceptowaną odpowiedź z tą odpowiedzią. dzwoniłem myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); w onResume działania. Zapewniło to, że EditText nie utrzymywał ostrości po obróceniu telefonu. - teedyay


Próbowałem odpowiedzi serval indywidualnie, ale nacisk jest nadal w EditText. Udaje mi się go rozwiązać tylko przy użyciu dwóch powyższych rozwiązań razem.

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

(Odsyłacz od Silver https://stackoverflow.com/a/8639921/15695 )

i usuń

 <requestFocus />

w EditText

(Odniesienie od floydaddict https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32



Oprócz tego musiałem dodać editext.clearFocus (), aby działało :) - Nav