ScrollView отключить перемещение фокуса - PullRequest
20 голосов
/ 21 марта 2011

У меня есть простая форма ввода;это вертикальный LinearLayout с EditTexts внутри 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>

Когда пользователь прокручивает форму, он автоматически перемещает фокус на видимый EditText.Можно отключить такое поведение и всегда сохранять фокус на тексте EditText, выбранном в данный момент на ощупь?

Я понимаю, что это может быть функцией, но мне нужно ее отключить.

Спасибо!

Ответы [ 8 ]

45 голосов
/ 19 августа 2011

Просто подумал, что поделюсь с этим своим решением.Хотя в некоторых комментариях к другому ответу говорится, что вы не можете переопределить это поведение, это не так.Это поведение прекращается, как только вы переопределяете метод 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 больше не будет мешать вашему вниманию.

15 голосов
/ 23 октября 2012

У меня тоже была такая проблема.Единственный способ, который помог мне, - это расширить представление прокрутки и переопределить neigher

@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);
    }
9 голосов
/ 09 июня 2015

Для меня работало объединение ответов @ dmon's и @ waj.

Только переопределение onRequestFocusInDescendants() прекрасно работало, когда я имел дело только с EditTexts внутри ScrollView, но когда я начал добавлять несколько типов просмотра, он не работал так хорошо.

Только переопределениеgetFocusables() вообще не работал.

Переопределение обоих onRequestFocusInDescendants() И 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;
  }

}
7 голосов
/ 30 мая 2012

Я перепробовал все решения, опубликованные здесь, но либо не работал на определенных версиях 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>();
  }

}
3 голосов
/ 04 апреля 2012

Попробуйте вырезать проблему из источника ( edit: , т.е. переместите ее в файл XML).

Во-первых, для этого должен быть фокусируемый элемент. Сделайте все фокусируемые элементы, содержащиеся в этой прокрутке, в нефокусируемые элементы. Сделайте их фокусируемыми после того, как представление будет раздутым и видимым.

android:focusable="false"
android:focusableInTouchMode="false"
1 голос
/ 29 июня 2012

Я нашел другое простое решение, которое работает для моей проблемы.

Я получил ScrollView с EditText вверху, а после него большой список TextViews, RatingBars и Buttons.Кнопки запускают AlertDialogs, и когда они всплывают, ScrollView перемещается наверх, к EditText, который все еще имеет фокус.

Чтобы решить эту проблему, я установил в onClick методе Деятельности requestFocusFromTouch() для щелкающего вида (в данном случае Кнопка).

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

Так что теперь, когда янажмите на Button, ScrollView переместится и поместите Button в центр экрана, это было именно то, что я хотел.

Надеюсь, это поможет.

0 голосов
/ 28 января 2014

Сегодня со мной случилось, в основном я программно добавлял View между некоторыми существующими представлениями, и Scroll автоматически перемещался, чтобы сфокусировать это представление.Я только что сделал следующее:

container.setFocusable( false );
0 голосов
/ 21 марта 2011

Для такого поведения используйте 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...