28

簡単な入力フォームがあります。これは、ScrollView 内に EditTexts を含む垂直 LinearLayout です。

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

ユーザーがフォームをスクロールすると、フォーカスが表示されている EditText に自動的に移動します。このような動作を無効にして、現在タッチで選択されている EditText に常にフォーカスすることは可能ですか?

これが機能である可能性があることは理解していますが、無効にする必要があります。

ありがとう!

4

10 に答える 10

50

これに対する私の解決策を共有したいと思っただけです。他の回答のコメントの一部は、この動作をオーバーライドできないと述べていますが、それは真実ではありません。この動作は、メソッドをオーバーライドするとすぐに停止しますonRequestFocusInDescendants()。したがって、これを行うには、ScrollView 拡張機能を作成するだけです。

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;
  }

}

これで完了です。これScrollViewで集中力が乱れることはもうありません。

于 2011-08-18T21:10:44.030 に答える
16

私もそのような問題を抱えていました。私を助けた唯一の方法は、スクロールビューを拡張し、隣人をオーバーライドすることです

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

また

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

ViewGroup.requestChildFocus(View child, View focused)ただし、次のようにメソッドをオーバーライドします。

    @Override
    public void requestChildFocus(View child, View focused) {
        // avoid scrolling to focused view
        // super.requestChildFocus(child, focused);
    }
于 2012-10-23T10:55:40.280 に答える
8

ここに投稿されたすべてのソリューションを試しましたが、特定の Android バージョンでは機能しなかったか、タッチ モードと非タッチ モードを切り替えるとき (ボタンをクリックしたり、トラックパッドを使用したとき) などの他の動作で混乱したりしました。

最終的に、メソッドをオーバーライドするとgetFocusablesうまくいくことがわかりました。

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>();
  }

}
于 2012-05-29T22:36:01.117 に答える
4

ソースから問題を切り離してみてください (編集:つまり、XML ファイルに移動します)。

まず、そのためにはフォーカス可能な要素が必要です。そのスクロールに含まれるすべてのフォーカス可能な要素をフォーカス不可能な要素にします。ビューが膨張して表示された後、それらをフォーカス可能にします。

android:focusable="false"
android:focusableInTouchMode="false"
于 2012-04-04T12:15:43.727 に答える
1

私の問題に役立つ別の簡単な解決策を見つけました。

一番上にがScrollViewありEditText、その後に TextView、RatingBar、および Button の大きなリストが表示されます。Buttons は AlertDialogs を起動し、ポップアップすると、ScrollViewは一番上に移動し、EditTextまだフォーカスがあるものに移動します。

それを解決するためにonClick、アクティビティのメソッドで、requestFocusFromTouch()クリックされたビュー (この場合はボタン) を設定しました。

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

だから今、私がクリックするとButton、 が動き、それを画面の中央にScrollView置きます。Button

お役に立てば幸いです。

于 2012-06-29T16:24:01.947 に答える
0

このような動作には、nextFocusUpおよび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>
于 2011-03-21T10:31:38.687 に答える
0

これで問題は解決しました。すべての状況に適用できるわけではありませんが、スクロールがプログラムで行われる私の場合はうまく機能します。

View originalFocus = getCurrentFocus();
scroller.fullScroll(View.FOCUS_DOWN);
if (originalFocus!=null) {originalFocus.requestFocusFromTouch();}
于 2020-06-23T20:11:38.983 に答える