Stop ScrollView from setting focus on EditText
This works. Not sure if it's the best solution or not.
// 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;
}
});
First, you can remove the parent of the ScrollView. Second, add focus options for the child(only one child per ScrollView):
android:descendantFocusability="beforeDescendants"
android:focusable="true"
android:focusableInTouchMode="true"
This is how your xml should look like:
<?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>
Also, notice that you have multiple id's with the same name. Try giving them unique names.
If you want only to hide the soft-keyboard, and let the EditText still have it's focus, you can do this by adding the following property to your activity in manifest:
android:windowSoftInputMode="stateHidden"
ah it is very late. But I still want to add this solution to help newbies like me.
ScrollView sv = (ScrollView)findViewById(R.id.scrollView);
sv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
sv.clearFocus();
return false;
}
});
yes it works, just set a listener to clearfocus. and it is better than ing requestFocusFromTouch to another view 'x', which will lead to the same problem-- srolling to the view 'x'.