web-dev-qa-db-ja.com

ScrollViewがEditTextにフォーカスを設定しないようにします

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>
46
user123321

これは動作します。それが最善の解決策であるかどうかはわかりません。

// 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;
        }
    });
107
user123321

最初に、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"
27
Ionut Negru

ああ、とても遅いです。しかし、私はまだこのソリューションを追加して、私のような初心者を支援したいと考えています。

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」にスクロールすると同じ問題が発生します。

2
Jack Ma nong