Scrollable TextView не позволяет выделять текст после приостановки приложения - PullRequest
0 голосов
/ 11 октября 2018

У меня есть прокрутка TextView, где пользователь может выбрать текст.Я добавляю полосу прокрутки, устанавливая метод движения на ScrollingMovementMethod.

Проблема: Выбор работает хорошо, если приложение не приостановлено (например, после переключения приложений).Как только приложение снова становится активным, выбор перестает работать, и в журнале появляется следующее сообщение:

W / TextView: TextView не поддерживает выбор текста.Выбор отменен.

Моя настройка:

У меня есть активность с CoordinatorLayout и фрагмент с TextView, завернутый в RelativeLayout, который выглядиткак это:

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:scrollbars="vertical" />

И в коде Java я должен сделать:

textView.setMovementMethod(new ScrollingMovementMethod());
textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

, потому что это был единственный способ работы в соответствии с это , Это и Это проблемы.

РЕДАКТИРОВАТЬ:

Проблема в следующем вызове

textView.setMovementMethod(new ScrollingMovementMethod());

Если я удаляю его, это работает, но я не могу понять, почему.

Минимальные шаги для воспроизведения проблемы:

1) Создайте пустое действие с TextView используя следующую схему.

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:text="Some very very very long text..."
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:scrollbars="vertical" />

</android.support.design.widget.CoordinatorLayout>

2) Установите параметры видимости для метода TextView in onStart().

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        TextView textView = findViewById(R.id.text_view);
        textView.setMovementMethod(new ScrollingMovementMethod());
        textView.setTextIsSelectable(true);
        textView.setFocusable(true);
        textView.setFocusableInTouchMode(true);
    }
}

3) Попробуйте использовать контекстное меню на TextView до и после приостановки приложения.

РЕДАКТИРОВАТЬ 2:

Удаление setMovementMethod(new ScrollingMovementMethod()) решает мою проблему, и функциональность после этого работает хорошо.Но я не совсем уверен, почему это было добавлено, и я боюсь, что это что-то затормозит, если я его уберу.Любая идея, почему можно использовать ScrollingMovementMethod в сочетании с android:scrollbars="vertical".Может быть, XML не работает в некоторых случаях?Идеи?И мне все еще интересно, зачем использовать ScrollingMovementMethod функциональность выбора тормозов?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы можете выбрать TextView двумя способами:

через XML:

 android:textIsSelectable="true"

через код Java:

 textView.setTextIsSelectable(true);
0 голосов
/ 21 октября 2018

настройка ScrollingMovementMethod дает TextView возможность прокручивать "по своему усмотрению", например, когда вы устанавливаете действительно длинный текст, и он обрезается по низу или краю.с ScrollingMovementMethod вы можете прокручивать TextView, нет необходимости помещать его в прокручиваемый контейнер, например, в ScrollView или HorizontalScrollView

android:scrollbars="vertical" строка говорит, что ЕСЛИ View get "scrollablility "(например, описанным выше методом перемещения), тогда пользовательский интерфейс должен показывать только vertical полосу прокруткииз документов:

Определяет, какие полосы прокрутки должны отображаться при прокрутке или нет.

и это View документы, а не TextViewособенно потому, что немногие расширяющиеся «виды» из View s могут получить «прокручиваемость», включая все ViewGroup s, такие как ScrollView, ListView, RecyclerView и т. д.

и, наконец, что это за строкаделает в вашем коде?внутри setTextIsSelectable у вас есть эта строка:

setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);

, поэтому на самом деле это метод перезаписи перемещения, который вы задали несколькими строками выше в своем собственном коде.Могу поспорить, что некоторое время назад ваш TextView можно было прокручивать «самому по себе», и однажды какой-то умный парень переписал это и вставил TextView, например, в ScrollView в XML, а метод перемещения остался в коде.textIsSelectable работает до Activity паузы, потому что после возобновления вы (снова) устанавливаете ScrollableMovementMethod, но внутри setTextIsSelectable у вас есть

 if (mEditor.mTextIsSelectable == selectable) return;

, вы устанавливаете этот флаг mTextIsSelectable при первом запускедо паузы Activity s, и этот флаг восстанавливается, поэтому приведенный ниже код не запускается (поэтому метод перемещения не переустанавливается с помощью ArrowKeyMovementMethod и ваш ScrollableMovementMethod остается).Так что ответьте на вопрос, что эта строка делает в вашем коде: она прерывает "возможность выбора" после приостановки и возобновления Activity, ничего кроме этого

примечания из источников ScrollingMovementMethod и ArrowKeyMovementMethod: только в ArrowKeyMovementMethod (устанавливается как метод перемещения внутри setTextIsSelectable, как указано выше) вы переопределили метод onTouchEvent и внутри него некоторые строки, обрабатывающие выделение

edit: примечание такжечто внутри setTextIsSelectable у вас есть настройка «фокусируемости», поэтому эти строки не нужны:

textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

, чтобы вы могли сократить код до одной строки:

textView.setTextIsSelectable(true);

или удалить всепроцитируйте Java-код и добавьте одну строку XML:

android:textIsSelectable="true"
0 голосов
/ 15 октября 2018

Пожалуйста, замените приведенный ниже код из вашего XML.

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" 
    android:scrollbars="vertical" />

Удалить приведенный ниже код из программы:

textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

Внутренний код метода setTextIsSelectable () :

public void setTextIsSelectable(boolean selectable) {
        if (!selectable && mEditor == null) return; // false is default value with no edit data

        createEditorIfNeeded();
        if (mEditor.mTextIsSelectable == selectable) return;

        mEditor.mTextIsSelectable = selectable;
        setFocusableInTouchMode(selectable);
        setFocusable(FOCUSABLE_AUTO);
        setClickable(selectable);
        setLongClickable(selectable);

        // mInputType should already be EditorInfo.TYPE_NULL and mInput should be null

        setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
        setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);

        // Called by setText above, but safer in case of future code changes
        mEditor.prepareCursorControllers();
    }

Программно онитакже делают то же самое, что я упоминал в XML.Поэтому в зависимости от ваших требований мы можем использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...