我在Android中有一个Activity
,其中包含两个元素:
EditText
ListView
当我的Activity
启动时,EditText
立即具有输入焦点(闪烁光标)。我不希望任何控件在启动时具有输入焦点。我尝试过:
EditText.setSelected(false);
EditText.setFocusable(false);
没有成功。我该如何说服EditText
在Activity
启动时不选择自己?
我在Android中有一个Activity
,其中包含两个元素:
EditText
ListView
当我的Activity
启动时,EditText
立即具有输入焦点(闪烁光标)。我不希望任何控件在启动时具有输入焦点。我尝试过:
EditText.setSelected(false);
EditText.setFocusable(false);
没有成功。我该如何说服EditText
在Activity
启动时不选择自己?
当我的按钮被按下时,我使用以下代码来防止EditText夺取焦点。
addButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
View focused = internalWrapper.getFocusedChild();
focused.setVisibility(GONE);
v.requestFocus();
addPanel();
focused.setVisibility(VISIBLE);
}
});
Basically, hide the edit text and then show it again. This works for me as the EditText is **not** in view so it doesn't matter whether it is showing.
You could try hiding and showing it in succession to see if that helps it lose focus.
0dp
的虚拟EditText
,并将焦点请求到该视图来实现此目的。
在您的XML布局中添加以下代码片段:<EditText
android:id="@+id/editText0"
android:layout_width="0dp"
android:layout_height="0dp"
android:hint="@string/dummy"
android:ems="10"
>
<requestFocus />
</EditText>
View current = getCurrentFocus();
if (current != null)
current.clearFocus();
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
请确保从xml文件中的EditText
标签中移除行"<requestFocus />"
。
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<requestFocus /> <!-- remove this line -->
</EditText>
你有Edittext
和list
。在OnStart/On Create中,应该将焦点设置在listview上:listview.requestfocus()
edit.setInputType(InputType.TYPE_NULL);
edit.setEnabled(false);
/**
* set focus to top level window
* disposes descendant focus
* disposes softInput
* */
public static void topLevelFocus(Context context){
if(Activity.class.isAssignableFrom(context.getClass())){
ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
if(tlView!=null){
tlView.setFocusable(true);
tlView.setFocusableInTouchMode(true);
tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
}
}
}
只需在EditText的父布局中添加android:focusableInTouchMode="true"
,即可解决此尴尬行为。
通过继承EditText
并重写onTouchEvent
方法,可以实现此功能。
class NonFocusableEditText: EditText {
constructor(context: Context): super(context)
constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)
override fun onTouchEvent(event: MotionEvent?): Boolean {
return if (isFocusable) super.onTouchEvent(event) else false
}
}
然后您可以像正常的EditText
一样在布局中使用它:
<com.yourpackage.NonFocusableEditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/your_hint"
android:imeOptions="actionDone"
android:inputType="textNoSuggestions" />