web-dev-qa-db-fra.com

Empêcher ScrollView de se concentrer sur EditText

ScrollView d'Android (lorsqu'il défile ou se lance) aime définir le focus d'un EditText lorsqu'il est l'un de ses enfants. Cela se produit lorsque vous faites défiler puis relâchez. Existe-t-il de toute façon pour arrêter ce comportement? J'ai essayé presque tout ce à quoi je peux penser et tout ce que j'ai lu sur StackOverflow. Rien n'a fonctionné pour moi. Vous trouverez ci-dessous un exemple de mise en page Si vous souhaitez le tester. Je suis désespéré d'arrêter ce comportement stupide.

<?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

Cela marche. Je ne sais pas si c'est la meilleure solution ou non.

// 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

Tout d'abord, vous pouvez supprimer le parent de ScrollView. Deuxièmement, ajoutez des options de focus pour l'enfant (un seul enfant par ScrollView):

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

Voici à quoi devrait ressembler votre 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>

Notez également que vous avez plusieurs identifiants avec le même nom. Essayez de leur donner des noms uniques.


Si vous souhaitez uniquement masquer le clavier virtuel et laisser le EditText conserver son focus, vous pouvez le faire en ajoutant la propriété suivante à votre activité dans le manifeste :

Android:windowSoftInputMode="stateHidden"
27
Ionut Negru

ah c'est très tard. Mais je veux toujours ajouter cette solution pour aider les débutants comme moi.

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

oui cela fonctionne, il suffit de mettre un auditeur sur clearfocus. et c'est mieux que de demander requestFocusFromTouch à une autre vue 'x', ce qui entraînera le même problème - enrôler à la vue 'x'.

2
Jack Ma nong