レイアウトを作成して表示するときにビューにフォーカスを設定するにはどうすればよいですか?


90

現在、私は含まれていレイアウト持っているButtonTextViewEditText。レイアウトが表示されると、フォーカスが自動的にに置かれ、EditTextAndroidスマートフォンにキーボードが表示されるようになります。それは私が欲しいものではありません。TextViewレイアウトが表示されているときにフォーカスを設定する方法はありますか?

回答:


109

フォーカスの設定:フレームワークは、ユーザー入力に応じて移動フォーカスを処理します。特定のビューにフォーカスを強制するには、requestFocus()を呼び出します


17

これは機能します:

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

それは何をするためのものか?ビューやフラグメントだけでなく、アクティビティ全体の一部の状態を変更しているようです。そのため、これについては注意し、その影響をすべて理解しない限り使用しません。
Vaddadi Kartick 2014年

確かに、元の投稿者の要求に基づいてこれを行うことはありません。これは現在の問題を解決するかもしれませんが、それを使用すると、後で問題を引き起こす可能性のある副作用があります。このようなハックがコードベースに侵入し、後で他のハックを追加して元のハックを無効にします。悪質なサイクルが続きます。そして、なぜコードが保守不能になるのか不思議に思います。ええ、あなたはそれを推測しました...私はこのようなことをする他の人と一緒に働き、それは私の人生を非常に困難にします。
dell116


6

セットする

 android:focusable="true"

あなたの <EditText/>


6

フォーカスを設定するには、ハンドラーを使用してrequestFocus()を遅延させます。

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

キーボードを非表示にしてみてください。このようなもの:

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


3

これらの行OnResumeも同様にfocusableInTouch設定し、コントロールを初期化するときにif がtrueに設定されていることを確認します

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

フォーカスを変更して、XMLのtextViewをフォーカス可能にする

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

とJavaで作成する

textView.requestFocus();

または単にキーボードを隠す

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"とtextView.requestFocus(); 私のために働いた。ありがとう!
ヴェルナー

2

上記の答えはどれも私にはうまくいきません。のみ(みましょうと言う)ソリューションは、最初に変更することであったのTextView無効 のEditTextフォーカスを受け取り、その後追加します

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

のonCreate示されるキーボードを防止するためのコールバック。これで、最初のEditTextはTextViewのように見えますが、ようやく最初のフォーカスを取得できます。


2

最後の提案は正しい解決策です。繰り返しますが、まずandroid:focusable="true"レイアウトxmlファイルに設定し、次にrequestFocus()コードのビューに設定します。


1

テキストビューにフォーカスできないと思います。たとえば、ボタンにフォーカスを設定するか、プロパティfocusableをtrueに設定してみてください。


1

サイズ「0 dip」のエディットテキストをur xmlの最初のコントロールとして追加できるので、レンダーにフォーカスできます。


1

まずandroid:windowSoftInputMode、アクティビティをAndroidManifest.xmlファイルに追加します。

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

これにより、キーボードが表示されなくEditTextなりますが、まだフォーカスされています。それを解決するには、設定することができますandroid:focusableInTouchmodeし、android:focusabletrueあなたのルートビューに。

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

上記のコードは、それRelativeLayoutがの代わりにフォーカスを得ていることを確認しますEditText


0

フォーカスは、タッチ以外の何か(つまり、Dパッド、キーボードなど)を使用しているときにUIコンポーネントを選択するためのものです。どのビューもフォーカスを受け取ることができますが、デフォルトではフォーカスできないビューもあります。(ビューをフォーカス可能にしてsetFocusable(true)、強制的にそれをフォーカスすることができ requestFocus()ます。)

ただし、タッチモードではフォーカスが無効になることに注意してください。したがって、指を使用している場合、プログラムでフォーカスを変更しても何も起こりません。これの例外は、入力エディターから入力を受け取るビューの場合です。ANはEditTextそのような例です。この特別な状況でsetFocusableInTouchMode(true)は、入力の送信先をソフトキーボードに知らせるために使用されます。にEditTextはデフォルトでこの設定があります。ソフトキーボードが自動的にポップアップします。

ソフトキーボードを自動的にポップアップさせたくない場合は、@ abeljusが指摘するように一時的に抑制することができます。

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

EditTextただし、ユーザーがをクリックしても、キーボードは表示されます。

参考文献:


この答えは間違っていますか?反対票はありませんでした。
Suragch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.