現在、私は含まれていレイアウト持っているButton
、TextView
とEditText
。レイアウトが表示されると、フォーカスが自動的にに置かれ、EditText
Androidスマートフォンにキーボードが表示されるようになります。それは私が欲しいものではありません。TextView
レイアウトが表示されているときにフォーカスを設定する方法はありますか?
現在、私は含まれていレイアウト持っているButton
、TextView
とEditText
。レイアウトが表示されると、フォーカスが自動的にに置かれ、EditText
Androidスマートフォンにキーボードが表示されるようになります。それは私が欲しいものではありません。TextView
レイアウトが表示されているときにフォーカスを設定する方法はありますか?
回答:
フォーカスの設定:フレームワークは、ユーザー入力に応じて移動フォーカスを処理します。特定のビューにフォーカスを強制するには、requestFocus()を呼び出します
これは機能します:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
フォーカスを設定するには、ハンドラーを使用して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();
}
}
);
}
}
これらの行OnResume
も同様にfocusableInTouch
設定し、コントロールを初期化するときにif がtrueに設定されていることを確認します
<controlName>.requestFocus();
<controlName>.requestFocusFromTouch();
フォーカスを変更して、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:windowSoftInputMode
、アクティビティをAndroidManifest.xml
ファイルに追加します。
<activity android:name="YourActivity"
android:windowSoftInputMode="stateHidden" />
これにより、キーボードが表示されなくEditText
なりますが、まだフォーカスされています。それを解決するには、設定することができますandroid:focusableInTouchmode
し、android:focusable
にtrue
あなたのルートビューに。
<LinearLayout android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
...
>
<EditText
...
/>
<TextView
...
/>
<Button
...
/>
</LinearLayout>
上記のコードは、それRelativeLayout
がの代わりにフォーカスを得ていることを確認しますEditText
フォーカスは、タッチ以外の何か(つまり、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
ただし、ユーザーがをクリックしても、キーボードは表示されます。