Свойство textIsSelectable не работает в TextView - PullRequest
0 голосов
/ 20 февраля 2020

Я хотел бы иметь TextView, чтобы пользователь мог выбрать / скопировать текст из TextView. TextView является частью фрагмента в TabLayout. Фрагмент имеет следующий макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="2">

    <TextView
        android:id="@+id/textview_translator_text"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@drawable/background_default"
        android:textIsSelectable="true"
        android:textSize="@dimen/edittext_textsize_translator"
        android:padding="@dimen/edittext_padding_translator"
        android:scrollbars="vertical"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/view_height_spacing" />

    <EditText
        android:importantForAutofill="no"
        android:inputType="text"
        android:id="@+id/edittext_translator_text"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@drawable/background_default"
        android:hint="@string/type_text"
        android:gravity="top"
        android:textSize="@dimen/edittext_textsize_translator"
        android:padding="@dimen/edittext_padding_translator"
        android:scrollbars="vertical"/>

</LinearLayout>

И соответствующий код Java выглядит следующим образом:

public class FragmentText extends Fragment {

    private TextView textView;

    private View rootView;

    private TextTranslator textTranslator;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_text, container, false);

        textTranslator = new TextTranslator();

        initializeTextView();
        initializeEditText();

        return rootView;
    }

    private void initializeTextView() {
        textView = rootView.findViewById(R.id.textview_translator_text);

        textView.setMovementMethod(new ScrollingMovementMethod());
    }

    private void initializeEditText() {
        EditText editText = rootView.findViewById(R.id.edittext_translator_text);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                // currently not used
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                String textInBinary = textTranslator.getBinarySequence(charSequence.toString());

                textView.setText(textInBinary);
            }

            @Override
            public void afterTextChanged(Editable editable) {
                // currently not used
            }
        });
    }
}

Я ожидал, что текст TextView можно выбрать (так как я используя свойство textIsSelectable). Однако по какой-то причине текст не выбирается.

Я тестировал приложение на нескольких устройствах с разными Android версиями, и ни на одном из этих устройств текст нельзя было выбрать.

Любое предположение, как я может сделать текст TextView доступным для выбора?

1 Ответ

0 голосов
/ 29 февраля 2020

Как-то дошло до этого поста. Глядя на правку, которую вы внесли в свой вопрос, причина вашей проблемы, кажется, заключается в следующем:

textView.setMovementMethod(new ScrollingMovementMethod());

внутри вашего initializeTextView() метода.

Проще говоря, это переписывает то, что вы установили в xml с android:textIsSelectable="true" Вы можете прочитать эту публикацию SO для получения дополнительной информации о том, как она вызывает проблему.

Самое простое решение состоит в том, чтобы удалить метод перемещения с прокруткой из кода и использовать android:textIsSelectable="true" в xml или установите TextView как выбираемый программно

textView.setTextIsSelectable(true);

, так как кажется, что он устанавливает значения некоторых других свойств, таких как focusable, focusableInTouchMode, longClickable и true.

...