Android. Как я могу отобразить выделение текста в текстовом представлении?

Я реализую приложение для чтения epub, в котором я использую textview для отображения текста epub. Я хочу выбрать текст из текстового представления, когда пользователь долго нажимает на текстовое представление, а затем выполняет несколько операций с выделенным текстом текстового представления, например выделение и т. Д. Итак, как я могу показать эти курсоры пользователю, чтобы выбрать текст, который хочет пользователь.

* Я не хочу использовать EditText и делать его похожим на текстовое представление. Может быть предпочтительнее переопределение textview.

* Я приложил скриншот, чтобы объяснить, что я ищу-

Скриншот из программы moon+reader, чтобы показать выделение текста, которое я хочу использовать в своем приложении


person Rohit    schedule 10.09.2012    source источник
comment
извините, изображение не загружается... попробуйте еще раз   -  person MBMJ    schedule 10.09.2012
comment
Я вижу изображение на своей стороне :\.. я перезагружу его   -  person Rohit    schedule 10.09.2012


Ответы (2)


Это задано давно, когда у меня тоже была эта проблема. Я сам сделал Selectable TextView для своего собственного приложения Jade Reader. Я разместил решение на GitHub. (Код в BitBucket привязан к приложению, но он более полный и отточенный.)

Выбираемое TextView (на GitHub)

Jade Reader (на BitBucket)

выбор

Использование следующего кода сделает ваш TextView доступным для выбора.

package com.zyz.mobile.example;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends Activity {

    private SelectableTextView mTextView;
    private int mTouchX;
    private int mTouchY;
    private final static int DEFAULT_SELECTION_LEN = 5;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // make sure the TextView's BufferType is Spannable, see the main.xml
        mTextView = (SelectableTextView) findViewById(R.id.main_text);
        mTextView.setDefaultSelectionColor(0x40FF00FF);


        mTextView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                showSelectionCursors(mTouchX, mTouchY);
                return true;
            }
        });
        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.hideCursor();
            }
        });
        mTextView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mTouchX = (int) event.getX();
                mTouchY = (int) event.getY();
                return false;
            }
        });
    }

    private void showSelectionCursors(int x, int y) {
        int start = mTextView.getPreciseOffset(x, y);

        if (start > -1) {
            int end = start + DEFAULT_SELECTION_LEN;
            if (end >= mTextView.getText().length()) {
                end = mTextView.getText().length() - 1;
            }
            mTextView.showSelectionControls(start, end);
        }
    }
}
person Ray Zhou    schedule 16.06.2013
comment
Уважаемый Рэй Чжоу, у меня проблема с JTextView внутри scrollView, у которого есть атрибут paddingTop, я думаю, вам нужно добавить смещение заполнения в getScrollXInternal() в JTextView. поправьте меня, если я ошибаюсь, спасибо - person dreamfighter; 12.05.2014
comment
Привет, @dreamfighter Я сделал пару исправлений в JTextView с тех пор, как опубликовал это, но исправления находятся в BitBucket, а не в GitHub. Вы могли бы заглянуть туда. - person Ray Zhou; 12.05.2014
comment
Он просто работает внутри scrollView :(. как я могу изменить его для работы внутри макета? - person hzandi; 15.06.2016

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

В версии 3.0+ у вас есть атрибут textIsSelectable в TextView, который обеспечивает это поведение. Например.:

<TextView android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/padding_medium"
        android:text="@string/hello_world"
        android:bufferType="spannable"
        android:textIsSelectable="true"
        android:textSize="28dip"
        tools:context=".MainActivity" />

Ниже этого лучше всего использовать EditText, который выглядит и ведет себя как TextView (кроме выбора). Или вы можете реализовать эту функцию самостоятельно, используя спаны.

person Zsombor Erdődy-Nagy    schedule 10.09.2012
comment
Но если вы видите снимок экрана, который я опубликовал, который относится к читателю луны + ... и у них есть эта функция ... Так что вы думаете? они используют edittext для этого? - person Rohit; 10.09.2012
comment
Могу поспорить, что для этого они использовали EditText. Попробуйте использовать HierarchyViewer, это может показать это. Или попробуйте спросить у разработчиков :) - person Zsombor Erdődy-Nagy; 10.09.2012
comment
Это, очевидно, путь. - person Pascalius; 27.04.2015