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>
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;
}
});
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"
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'.