Jak ustawić fokus na widoku, gdy układ jest tworzony i wyświetlany?


90

Obecnie mam układ, który zawiera a Button, a TextViewi EditText. Po wyświetleniu układu fokus zostanie automatycznie umieszczony na EditText, co spowoduje wyświetlenie klawiatury na telefonie z Androidem. Nie tego chcę. Czy istnieje sposób, w jaki mogę ustawić fokus TextViewna niczym lub na niczym, gdy wyświetlany jest układ?

Odpowiedzi:


109

Ustaw fokus: struktura będzie obsługiwać przenoszenie fokusu w odpowiedzi na dane wejściowe użytkownika. Aby wymusić skupienie się na określonym widoku, wywołaj requestFocus ()


17

To działa:

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

Co to robi? Wygląda na to, że modyfikuje pewien stan całej czynności, a nie tylko widok lub fragment, więc byłbym ostrożny i nie używałbym tego, chyba że rozumiem wszystkie jego konsekwencje.
Kartick Vaddadi

Rzeczywiście, nie zrobiłbym tego na podstawie prośby pierwotnego autora. Może to rozwiązać bieżący problem, ale używanie go ma skutki uboczne, które mogą powodować problemy później. To właśnie takie hacki trafiają do baz kodu, które powodują, że inne hacki są później dodawane, aby zanegować oryginalny hack ... błędne koło trwa ... i ludzie zastanawiają się, dlaczego kod staje się nie do utrzymania. Tak, zgadliście ... Pracuję z innymi, którzy robią takie rzeczy i bardzo utrudnia mi to życie.
dell116



6

Aby ustawić ostrość, opóźnij requestFocus () za pomocą 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();
          } 
       }
     );
   }
}

5

Możesz spróbować po prostu ukryć klawiaturę. Coś takiego:

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


3

Ustaw te linie OnResumerównież na i upewnij się, że focusableInTouchjest ustawione na true podczas inicjowania formantów

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

aby zmienić fokus, ustaw element textView w xml na fokus

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

i java w czasie tworzenia

textView.requestFocus();

lub po prostu ukryj klawiaturę

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" i textView.requestFocus (); pracował dla mnie. Dzięki!
Werner

2

Żadna z powyższych odpowiedzi nie działa dla mnie. Jedynym (powiedzmy) rozwiązaniem była zmiana pierwszego TextView w wyłączonym EditText, który otrzymuje fokus, a następnie dodanie

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

w wywołaniu zwrotnym onCreate, aby zapobiec wyświetlaniu klawiatury. Teraz mój pierwszy EditText wygląda jak TextView, ale w końcu może uzyskać początkowy fokus.


2

Ostatnia sugestia to właściwe rozwiązanie. Powtarzam, najpierw ustaw android:focusable="true"w xmlpliku układu , a następnie requestFocus()w widoku w kodzie.


1

myślę, że widok tekstu nie jest aktywny. Spróbuj na przykład ustawić fokus na przycisku lub ustawić właściwość, którą można ustawić na true.


1

możesz dodać tekst edycji o rozmiarze "0 dip" jako pierwszą kontrolkę w ur xml, więc to skupi się na renderowaniu. (upewnij się, że można go ustawić i wszystko ...)


1

Możesz zacząć od dodania android:windowSoftInputModedo swojej aktywności w AndroidManifest.xmlpliku.

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

Spowoduje to, że klawiatura nie będzie wyświetlana, ale EditTextnadal będzie fokus. Aby rozwiązać ten można ustawić android:focusableInTouchmodei android:focusableaby truena widoku głównym.

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

Powyższy kod upewni się, że RelativeLayoutzamiastEditText


0

Skupiamy się na wybieraniu komponentów interfejsu użytkownika, gdy używasz czegoś innego niż dotyk (np. Pada kierunkowego, klawiatura itp.). Każdy widok może otrzymać fokus, chociaż niektóre nie są domyślnie ustawiane. (Możesz setFocusable(true)ustawić ostrość widoku i wymusić na nim skupienie requestFocus()).

Należy jednak pamiętać, że w trybie dotykowym ostrość jest wyłączona . Jeśli więc używasz palców, programowa zmiana fokusu nic nie robi. Wyjątkiem są widoki, które otrzymują dane wejściowe z edytora danych wejściowych. A EditTextjest takim przykładem. W tej specjalnej sytuacji setFocusableInTouchMode(true)jest używany, aby dać klawiaturze programowej znać, gdzie wysłać dane wejściowe. EditTextMa to ustawienie domyślne. Miękka klawiatura pojawi się automatycznie.

Jeśli nie chcesz, aby klawiatura programowa pojawiała się automatycznie, możesz tymczasowo ją wyłączyć, jak zauważył @abeljus:

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

EditTextJednak po kliknięciu przez użytkownika klawiatura nadal powinna być wyświetlana.

Czytaj dalej:


Czy ta odpowiedź jest błędna? Nie pozostawiono żadnego komentarza przy głosowaniu przeciw.
Suragch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.