Wie kann ich den Fokus auf eine Ansicht legen, wenn ein Layout erstellt und angezeigt wird?

89

Derzeit habe ich ein Layout, das a Button, a TextViewund an enthält EditText. Wenn das Layout angezeigt wird, wird der Fokus automatisch auf das gelegt EditText, wodurch die Tastatur auf dem Android-Handy angezeigt wird . Es ist nicht was ich will. Gibt es eine Möglichkeit, den Fokus auf TextViewoder auf nichts zu setzen, wenn ein Layout angezeigt wird?

user256239
quelle

Antworten:

109

Fokus setzen: Das Framework behandelt das Verschieben des Fokus als Reaktion auf Benutzereingaben. Rufen Sie requestFocus () auf, um den Fokus auf eine bestimmte Ansicht zu erzwingen .

Mark B.
quelle
17

Das funktioniert:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Charles Mosndup
quelle
Was tut es? Es scheint, als würde ein bestimmter Status für die gesamte Aktivität geändert und nicht nur eine Ansicht oder ein Fragment. Daher wäre ich vorsichtig und würde ihn nur verwenden, wenn ich alle seine Auswirkungen verstehe.
Vaddadi Kartick
In der Tat würde ich dies nicht auf der Grundlage der Anfrage des Originalplakats tun. Dies kann das aktuelle Problem lösen, aber die Verwendung hat Nebenwirkungen, die später zu Problemen führen können. Es sind solche Hacks, die ihren Weg in Codebasen finden, die dazu führen, dass später andere Hacks hinzugefügt werden, um den ursprünglichen Hack zu negieren. Der Teufelskreis geht weiter. Die Leute fragen sich, warum Code nicht mehr wartbar ist. Ja, du hast es erraten ... Ich arbeite mit anderen zusammen, die solche Sachen machen, und das macht mein Leben sehr schwierig.
Dell116
6

Sie sollten dies hinzufügen:

android:focusableInTouchMode="true"
Arif Jusoh
quelle
6

einstellen

 android:focusable="true"

in deinem <EditText/>

Ravi
quelle
6

Um den Fokus festzulegen, verzögern Sie requestFocus () mit einem 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
quelle
5

Sie können versuchen, nur die Tastatur auszublenden. Etwas wie das:

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

Versuchen

comp.requestFocusInWindow();
JARC
quelle
3

Setzen Sie diese Zeilen ebenfalls auf OnResumeund stellen Sie sicher, dass focusableInTouchtrue festgelegt ist, während Sie Ihre Steuerelemente initialisieren

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();
Pawan Maheshwari
quelle
3

Um den Fokus zu ändern, machen Sie die Textansicht in XML fokussierbar

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

und in java in on create

textView.requestFocus();

oder einfach die Tastatur ausblenden

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
quelle
android: focusable = "true" und textView.requestFocus (); arbeitete für mich. Vielen Dank!
Werner
2

Keine der obigen Antworten funktioniert für mich. Die einzige (sagen wir) Lösung bestand darin, die erste Textansicht in einem deaktivierten EditText zu ändern, der den Fokus erhält, und dann hinzuzufügen

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

im onCreate- Rückruf, um zu verhindern, dass die Tastatur angezeigt wird. Jetzt sieht mein erster EditText wie eine Textansicht aus, kann aber endlich den anfänglichen Fokus erhalten.

Lorenzoff
quelle
2

Der letzte Vorschlag ist die richtige Lösung. Nur um es zu wiederholen, legen Sie es zuerst android:focusable="true"in der Layoutdatei xmlund dann requestFocus()in der Ansicht in Ihrem Code fest.

Reza Nezami
quelle
1

Ich denke, eine Textansicht ist nicht fokussierbar. Versuchen Sie beispielsweise, den Fokus auf eine Schaltfläche zu setzen oder die fokussierbare Eigenschaft auf true zu setzen.

Lapakrette
quelle
1

Sie können einen Bearbeitungstext der Größe "0 dip" als erstes Steuerelement in ur xml hinzufügen, damit der Fokus auf das Rendern gelegt wird. (Stellen Sie sicher, dass er fokussierbar ist und alle ...)

con_9
quelle
1

Sie können beginnen, indem Sie android:windowSoftInputModeIhrer Aktivität eine AndroidManifest.xmlDatei hinzufügen .

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

Dadurch wird die Tastatur nicht angezeigt, sie EditTextist jedoch weiterhin fokussiert. Um dies zu lösen, können Sie android:focusableInTouchmodeund android:focusablein trueIhrer Stammansicht festlegen .

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

Der obige Code stellt sicher, RelativeLayoutdass der Fokus statt des Fokus erhalten wirdEditText

Uilque Messias
quelle
0

Der Schwerpunkt liegt auf der Auswahl von UI-Komponenten, wenn Sie etwas anderes als Touch verwenden (z. B. ein Steuerkreuz, eine Tastatur usw.). Jede Ansicht kann den Fokus erhalten, einige sind jedoch standardmäßig nicht fokussierbar. (Sie können eine Ansicht fokussierbar machen setFocusable(true)und erzwingen, dass sie fokussiert wird requestFocus().)

Es ist jedoch wichtig zu beachten, dass im Touch-Modus der Fokus deaktiviert ist . Wenn Sie also Ihre Finger verwenden, bewirkt das programmgesteuerte Ändern des Fokus nichts. Eine Ausnahme bilden Ansichten, die Eingaben von einem Eingabeditor erhalten. An EditTextist so ein Beispiel. In dieser speziellen Situation setFocusableInTouchMode(true)wird die Softtastatur darüber informiert, wohin Eingaben gesendet werden sollen. An EditTexthat diese Einstellung standardmäßig. Die Softtastatur wird automatisch angezeigt.

Wenn Sie nicht möchten, dass die Softtastatur automatisch angezeigt wird, können Sie sie vorübergehend unterdrücken, wie @abeljus feststellt:

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

Wenn ein Benutzer auf klickt EditText, sollte die Tastatur trotzdem angezeigt werden.

Weiterführende Literatur:

Suragch
quelle
Ist diese Antwort falsch? Mit der Abwertung wurde kein Kommentar hinterlassen.
Suragch