目前,我有一个包含a Button
,a TextView
和an 的布局EditText
。显示布局时,焦点将自动放在上EditText
,这将触发键盘显示在Android手机上。这不是我想要的。TextView
显示布局时,有什么方法可以将焦点设置在什么上?
Answers:
设置焦点:该框架将响应用户输入来处理移动焦点。若要将焦点强制到特定视图,请调用requestFocus()
这有效:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
要设置焦点,请使用Handler延迟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
在初始化控件时将其设置为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:focusable="true"
在布局xml
文件中设置,然后requestFocus()
在代码视图中设置。
您可以从添加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-pad,键盘等)时,焦点用于选择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
,它仍应显示键盘。