android-listview - 在Activity启动是停止从EditText获得焦点

  显示原文与译文双语对照的内容

我有一个 Android Activity,有两个元素:

  1. EditText
  2. ListView

当我的Activity 启动时,EditText 立即有输入焦点( 闪烁光标) 。 我不希望任何控件在启动时具有输入焦点。 我试过:


EditText.setSelected(false);

不走运。如何让 EditTextActivity 启动时不选择自身?

时间: 原作者:

来自Luc和Mark的优秀答案,但缺少一个好的代码示例:


<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
 android:focusable="true" android:focusableInTouchMode="true"
 android:layout_width="0px" android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
 to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:nextFocusUp="@id/autotext" android:nextFocusLeft="@id/autotext"/>

是你不希望它拥有焦点的实际问题? 或者你不想让它显示虚拟键盘,因为它是web页面的焦点? 我没有看到 web EditText的问题在开始时有焦点,但是当用户没有明确地请求焦点放在 web EditText ( 并打开键盘作为结果) 时,softInput窗口是一个问题

如果是虚拟键盘的问题,请参阅 AndroidManifest.xml <Activity> 元素文档。

android:windowSoftInputMode="stateHidden" - 输入 Activity 时总是隐藏它

或者 android:windowSoftInputMode="stateUnchanged" - 别更改它( 例如不要 显示它如果还没有显示,但如果是开放进入 Activity 时,仍在执行)

原作者:

一个更简单的解决方案存在。 在你的父布局中设置这些属性:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/mainLayout"
 android:descendantFocusability="beforeDescendants"
 android:focusableInTouchMode="true"> 

现在,当 Activity 开始这个主布局时,默认情况下将获得焦点。

另外,我们可以在运行时将焦点从子视图中移除,方法是将焦点再次赋予主布局,如下所示:


findViewById(R.id.mainLayout).requestFocus();

Guillaume Perrot, 好的注释 :

android: descendantfocusability="beforeDescendants"似乎是默认的( 整数值为 0 ) 。 它只通过添加 android: focusableintouchmode="真"。

实际上,我们可以看到 beforeDescendants 设置为 ViewGroup.initViewGroup() 方法( 2.2.2 Android ) 中的默认值。 但不等于 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

感谢 Guillaume 。

原作者:

我找到的唯一解决方案是:

  • 创建一个 LinearLayout ( 我不知道其他种类的布局工作)
  • 设置属性 android:focusable="true"android:focusableInTouchMode="true"

并且 web EditText在启动 Activity 之后将得不到焦点

原作者:

这个问题似乎来自于一个属性,我只能在布局的XML形式中看到它。

确保在 web EditText声明的末尾删除此行:


<requestFocus/>

应该会有类似的东西:


<EditText
 android:id="@+id/emailField"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:inputType="textEmailAddress">

//<requestFocus/>/* <-- without this line */
</EditText>

下面的命令将停止 web edittext在创建时获取焦点,但当你触摸时将它的捕获。


<EditText
 android:id="@+id/et_bonus_custom"
 android:focusable="false"/>

因此,在xml中设置焦点为假,但该键在java中,你可以添加以下侦听器:


etBonus.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 v.setFocusable(true);
 v.setFocusableInTouchMode(true);
 return false;
 }
});

因为你返回假,换句话说,不消耗事件,聚焦行为将像往常一样。

原作者:

使用其他海报提供的信息,我使用了以下解决方案:

在布局 XML.


<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
 android:id="@+id/linearLayout_focus"
 android:focusable="true"
 android:focusableInTouchMode="true"
 android:layout_width="0px"
 android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
 android:id="@+id/autocomplete"
 android:layout_width="200dip"
 android:layout_height="wrap_content"
 android:layout_marginTop="20dip"
 android:inputType="textNoSuggestions|textVisiblePassword"/>

在 onCreate().


private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.mylayout);

//get references to UI components
 mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
 mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

在 onResume(), 最终还可以


@Override
protected void onResume() {
 super.onResume();

//do not give the editbox focus automatically when activity starts
 mAutoCompleteTextView.clearFocus();
 mLinearLayout.requestFocus();
}

原作者:

这些解决方案都没有为我工作。 我修复自动对焦的方法是:


<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
 <intent-filter> 
 </intent-filter>
</activity>

...