現在、Button
、TextView
、およびEditText
を含むレイアウトがあります。レイアウトが表示されると、フォーカスは自動的にEditText
に置かれ、Android電話にキーボードが表示されます。それは私が望むものではありません。レイアウトが表示されているときに、TextView
にフォーカスを設定する方法、または何にもフォーカスを設定できない方法はありますか?
フォーカスの設定:フレームワークは、ユーザー入力に応じてフォーカスの移動を処理します。特定のビューにフォーカスを強制するには、 requestFocus ()を呼び出します
これは動作します:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
キーボードを非表示にしてみてください。このようなもの:
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
フォーカスを設定するには、ハンドラーを使用して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();
}
}
);
}
}
これを追加する必要があります:
Android:focusableInTouchMode="true"
セットする
Android:focusable="true"
あなたの<EditText/>
試してみる
comp.requestFocusInWindow();
これらの行もOnResume
に設定し、コントロールを初期化するときにfocusableInTouch
が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);
}
上記の答えはどれも私にはうまくいきません。唯一の(たとえば)解決策は、最初のTextViewをdisabledEditTextに変更することですフォーカスを受け取ってから追加する
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
onCreateコールバックで、キーボードが表示されないようにします。これで、私の最初のEditTextはTextViewのように見えますが、最終的に最初のフォーカスを取得できます。
最後の提案は正しい解決策です。繰り返しますが、最初にAndroid:focusable="true"
をレイアウトxml
ファイルに設定し、次にrequestFocus()
をコードのビューに設定します。
テキストビューはフォーカスできないと思います。たとえば、ボタンにフォーカスを設定するか、プロパティfocusableをtrueに設定してください。
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
がフォーカスを得ていることを確認します
レイアウトxmlファイルでAndroid:focusable="true"
を設定し、コードのビューでrequestFocus()
を設定します
いいえ、ここでは機能しません。
ur xmlの最初のコントロールとしてサイズ「0 dip」のエディットテキストを追加できます。これにより、レンダーにフォーカスが移ります。
フォーカスは、タッチ以外の何か(つまり、dパッド、キーボードなど)を使用しているときにUIコンポーネントを選択するためのものです。一部のビューはデフォルトでフォーカス可能ではありませんが、どのビューでもフォーカスを受け取ることができます。 (ビューをsetFocusable(true)
でフォーカス可能にし、requestFocus()
で強制的にフォーカスすることができます。)
ただし、タッチモードの場合、フォーカスは無効になっていることに注意することが重要です。したがって、指を使用している場合、フォーカスをプログラムで変更しても何も起こりません。これの例外は、入力エディターから入力を受け取るビューの場合です。 EditText
はそのような例です。この特殊な状況では、setFocusableInTouchMode(true)
を使用して、入力を送信する場所をソフトキーボードに知らせます。 EditText
にはデフォルトでこの設定があります。ソフトキーボードが自動的にポップアップします。
ソフトキーボードを自動的にポップアップ表示したくない場合は、@ abeljusが指摘したように一時的に非表示にできます。
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
ただし、ユーザーがEditText
をクリックしても、キーボードは表示されます。