ScrollView禁用焦点移动

Ale*_*sky 21 android focus android-scrollview

我有一个简单的输入表格; 它是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>
Run Code Online (Sandbox Code Playgroud)

当用户滚动表单时,它会自动将其焦点移动到可见的EditText.可以禁用此类行为并始终将焦点放在当前通过触摸选择的EditText上吗?

我知道这可能是一个功能,但我需要禁用它.

谢谢!

dmo*_*mon 46

我以为我会分享我的解决方案.即使其他一些答案的评论声明您无法覆盖此行为,但事实并非如此.一旦覆盖该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;
  }

}
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.这ScrollView将使你的焦点不再混乱.

  • 很好,按预期工作.但请注意,在XML中使用此类时,必须提供完整路径(包括包名称,如com.myapp.stuff.NonFocusingScrollView) - 否则,它不能被夸大. (3认同)
  • @musselwhizzle:根据您使用ScrollView的方式,您可能需要覆盖其他方法.在我的例子中,我需要覆盖fullScroll()和pageScroll(). (2认同)

rus*_*t0R 15

我也遇到过这样的问题.帮助我的唯一方法是扩展滚动视图并覆盖neigher

@Override
public ArrayList<View> getFocusables(int direction) {
    return new ArrayList<View>();
}
Run Code Online (Sandbox Code Playgroud)

要么

@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但要覆盖ViewGroup.requestChildFocus(View child, View focused)方法如下:

    @Override
    public void requestChildFocus(View child, View focused) {
        // avoid scrolling to focused view
        // super.requestChildFocus(child, focused);
    }
Run Code Online (Sandbox Code Playgroud)

  • 其他两个对我也没有用.这种方法的问题是它破坏了`Activity.getCurrentFocus()`.为了解决这个问题,在你的`requestChildFocus(View child,View focused)`方法中,调用`super.requestChildFocus(child,child)`,诱使它认为新聚焦的视图已经被聚焦,因此不需要滚动. (4认同)

Hun*_*r S 9

对我有用的是@ dmon和@ waj的答案.

onRequestFocusInDescendants()当我只处理ScrollView内部的EditTexts时,只有覆盖效果很好,但是当我开始添加多个View类型时,它的效果并不好.

只有压倒一切getFocusables()根本不起作用.

覆盖两个onRequestFocusInDescendants()AND 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>();
  }

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

}
Run Code Online (Sandbox Code Playgroud)


waj*_*waj 7

我尝试了在这里发布的所有解决方案,但要么在某些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>();
  }

}
Run Code Online (Sandbox Code Playgroud)