Le ScrollView désactiver l'objectif

j'ai une forme d'entrée simple; c'est une sortie en ligne verticale avec EditTexts à l'intérieur d'une ScrollView.

<ScrollView android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">
            <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:padding="10dip"
                  android:gravity="center_vertical"
                  android:orientation="horizontal">
                  <TextView style="@style/Text"
                         android:text="Name"/>
                  <EditText style="@style/EditBox"/>
            </LinearLayout>
            <View style="@style/Divider"/>
            <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:padding="10dip"
                  android:gravity="center_vertical"
                  android:orientation="horizontal">
                  <TextView style="@style/Text"
                         android:text="Password"/>
                  <EditText style="@style/EditBox"/>
            </LinearLayout>               
            ... 
     </LinearLayout>
</ScrollView>

lorsque l'utilisateur scrolls le formulaire, il déplace automatiquement son focus vers le texte édité visible. Il est possible de désactiver un tel comportement et de toujours se concentrer sur L'EditText actuellement sélectionné par touch?

je comprends que c'est peut-être une caractéristique, mais je dois la désactiver.

Merci!

18
demandé sur jeyoor 2011-03-21 12:36:00

8 réponses

J'ai juste pensé que je partagerais ma solution à ça. Même si certains commentaires de l'autre réponse indiquent que vous ne pouvez pas outrepasser ce comportement, ce n'est pas vrai. Ce comportement s'arrête dès que vous remplacer le onRequestFocusInDescendants() méthode. Il vous suffit donc de créer votre extension ScrollView pour le faire:

public class NonFocusingScrollView extends ScrollView {

  public NonFocusingScrollView(Context context) {
    super(context);
  }

  public NonFocusingScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public NonFocusingScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
    return true;
  }

}

et c'est fini. ScrollView ne va plus toucher à ta concentration.

43
répondu dmon 2012-10-23 14:01:05

j'ai eu un problème aussi. La seule façon qui m'a aidé est d'étendre la vue de défilement et d'outrepasser neigher

@Override
public ArrayList<View> getFocusables(int direction) {
    return new ArrayList<View>();
}

ou

@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
    return true;
}

mais pour remplacer ViewGroup.requestChildFocus(View child, View focused) méthode comme suit:

    @Override
    public void requestChildFocus(View child, View focused) {
        // avoid scrolling to focused view
        // super.requestChildFocus(child, focused);
    }
12
répondu rus1f1kat0R 2012-10-23 10:55:40

j'ai essayé toutes les solutions postées ici mais soit ne fonctionnait pas sur certaines versions Android ou il a foiré avec un autre comportement comme lors de la commutation entre le mode tactile et non tactile (quand vous cliquez sur les boutons ou utilisez le trackpad).

j'ai finalement trouvé que la substitution de la méthode getFocusables est-ce que le truc:

public class FixedFocusScrollView extends ScrollView {

  public FixedFocusScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  public FixedFocusScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public FixedFocusScrollView(Context context) {
    super(context);
  }

  @Override
  public ArrayList<View> getFocusables(int direction) {
    return new ArrayList<View>();
  }

}
7
répondu waj 2012-05-29 22:36:01

ce qui a fonctionné pour moi, c'est de combiner les réponses de @dmon et @waj.

Seulement primordial onRequestFocusInDescendants() fonctionnait bien quand je ne traitais que des textes édités dans le ScrollView, mais quand j'ai commencé à ajouter plusieurs types de vues, ça ne marchait pas si bien.

Seulement primordial getFocusables() n'a pas fonctionné du tout.

Substituant à la fois onRequestFocusInDescendants() et getFocusables() semble fonctionner à merveille dans tous les scénarios.

public class FixedFocusScrollView extends ScrollView {

  public FixedFocusScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  public FixedFocusScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public FixedFocusScrollView(Context context) {
    super(context);
  }

  @Override
  public ArrayList<View> getFocusables(int direction) {
      return new ArrayList<View>();
  }

  @Override
  protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
    return true;
  }

}
6
répondu Hunter S 2015-06-09 16:24:43

essayez de couper le problème de la source ( edit: c'est à dire le déplacer vers un fichier XML).

tout d'abord, il doit y avoir un élément focalisable pour que cela se produise. Faites en sorte que tous les éléments focalisables contenus dans ce défilement deviennent des éléments non focalisables. Faites-les se concentrer après que la vue est gonflée et est visible.

android:focusable="false"
android:focusableInTouchMode="false"
3
répondu valera 2012-04-04 15:25:57

j'ai trouvé une autre solution qui fonctionne pour mon problème.

j'ai eu un ScrollView avec un texte D'édition en haut, et après ça, une grande liste de TextViews, de barres de notation et de boutons. Les boutons de lancement AlertDialogs, et quand ils apparaissent, le ScrollView se déplace vers le haut, vers le texte D'édition qui est celui qui a encore la mise au point.

pour le résoudre, j'ai placé dans la méthode onClick de L'activité le requestFocusFromTouch () à la vue cliquée (dans ce cas le Bouton.)

public void onClick(View v) {
    v.requestFocusFromTouch();
    ...
}

donc maintenant quand je clique sur un bouton le ScrollView bouge et mets ce bouton au centre de l'écran, c'était exactement ce que je voulais.

j'espère que ça aide.

1
répondu Hugo 2012-06-29 16:24:01

pour un tel comportement, utilisez nextFocusUp et nextFocusDown.

<EditText
    android:id="@+id/my_edit_text"
    android:nextFocusDown="@id/my_edit_text"
    android:nextFocusUp="@id/my_edit_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</EditText>
0
répondu pawelzieba 2011-03-21 10:31:38

ce qui m'est arrivé aujourd'hui, en gros, c'est que j'ajoutais une vue programmée entre certaines vues existantes, et que Scroll se déplaçait automatiquement pour mettre l'accent sur cette vue. Ce que je viens de faire est le suivant:

container.setFocusable( false );
0
répondu Reinherd 2014-01-28 07:59:31