AndroidのScrollView(スクロールまたはフリングした場合)は、EditTextが子の1つである場合にEditTextのフォーカスを設定することを好みます。スクロールしてから離すと発生します。とにかくこの動作を停止する方法はありますか? StackOverflowで考えられることはほぼすべて試し、読んだことはすべて試しました。何も私のために働いていません。以下は、テストする場合のレイアウト例です。私はこの愚かな行動を止めたいと思っています。
<?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>
これは動作します。それが最善の解決策であるかどうかはわかりません。
// 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ごとに1つの子のみ)。
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にフォーカスを保持したい場合は、manifest:
Android:windowSoftInputMode="stateHidden"
ああ、とても遅いです。しかし、私はまだこのソリューションを追加して、私のような初心者を支援したいと考えています。
ScrollView sv = (ScrollView)findViewById(R.id.scrollView);
sv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
sv.clearFocus();
return false;
}
});
はい、動作します。リスナーをclearfocusに設定するだけです。また、requestFocusFromTouchを別のビュー「x」に送るよりも、ビュー「x」にスクロールすると同じ問題が発生します。