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?

user256239
źródło

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

Mark B.
źródło
17

To działa:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Charles Mosndup
źródło
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

Powinieneś to dodać:

android:focusableInTouchMode="true"
arif jusoh
źródło
6

Zestaw

 android:focusable="true"

w Twoim <EditText/>

ravi
źródło
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();
          } 
       }
     );
   }
}
Dan McNerthney
źródło
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);
abeljus
źródło
3

Próbować

comp.requestFocusInWindow();
JARC
źródło
3

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

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Pawan Maheshwari
źródło
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);
}
Mina Shaker
źródło
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.

lorenzoff
źródło
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.

Reza Nezami
źródło
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.

lapakrette
źródło
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 ...)

con_9
źródło
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

Uilque Messias
źródło
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:

Suragch
źródło
Czy ta odpowiedź jest błędna? Nie pozostawiono żadnego komentarza przy głosowaniu przeciw.
Suragch