停止ScrollView从EditText设置焦点

Android的ScrollView(当滚动或fling'd)喜欢设置一个EditText的焦点,当它是它的一个孩子。 它发生在你滚动然后释放。 无论如何阻止这种行为? 我尝试了几乎所有我能想到的,以及我在StackOverflow上读到的所有内容。 没有任何工作对我来说。 下面是一个布局示例如果你想testing它。 我绝望地阻止这种愚蠢的行为。

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ScrollView android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginRight="50dp" android:focusable="true" android:focusableInTouchMode="true" > <EditText android:layout_width="fill_parent" android:layout_height="100dp" android:text="TestApp 1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <EditText android:layout_width="fill_parent" android:layout_height="100dp" android:text="Bleh...." /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <EditText android:layout_width="fill_parent" android:layout_height="100dp" android:text="TestApp 1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="MeeEEEEEEEEEEEEE" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> </LinearLayout> </ScrollView> </LinearLayout> 

这工作。 不知道这是否是最好的解决scheme。

 // SCROLL VIEW HACK // BOGUS ScrollView view = (ScrollView)findViewById(R.id.scrollView); view.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); view.setFocusable(true); view.setFocusableInTouchMode(true); view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.requestFocusFromTouch(); return false; } }); 

首先,您可以删除ScrollView的父级。 其次,为孩子添加焦点选项(每个ScrollView只有一个孩子):

 android:descendantFocusability="beforeDescendants" android:focusable="true" android:focusableInTouchMode="true" 

这就是你的XML应该是这样的:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="50dp" android:descendantFocusability="beforeDescendants" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" > <EditText android:id="@+id/editText_one" android:layout_width="match_parent" android:layout_height="100dp" android:text="TestApp 1" /> <Button android:id="@+id/btn_one" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn_two" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn_three" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <EditText android:id="@+id/editText_two" android:layout_width="match_parent" android:layout_height="100dp" android:text="Bleh...." /> <Button android:id="@+id/btn_four" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <EditText android:id="@+id/editText_three" android:layout_width="match_parent" android:layout_height="100dp" android:text="TestApp 1" /> <Button android:id="@+id/btn_five" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> <Button android:id="@+id/btn_six" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="MeeEEEEEEEEEEEEE" /> <Button android:id="@+id/btn_seven" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TestApp 1" /> </LinearLayout> </ScrollView> 

另外,请注意,您有多个具有相同名称的ID。 尝试给他们独特的名字。


如果只想隐藏软键盘,并让EditText仍然有焦点,可以通过将以下属性添加到清单中的活动来完成此操作:

 android:windowSoftInputMode="stateHidden" 

啊很晚了啊。 但我仍然想要添加这个解决scheme来帮助像我这样的新手。

 ScrollView sv = (ScrollView)findViewById(R.id.scrollView); sv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { sv.clearFocus(); return false; } }); 

是的,它的工作,只是设置一个听众清除焦点。 并且它比requestFocusFromTouch更好的另一个视图'x',这将导致同样的问题 – 滚动到视图'x'。