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

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

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

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

Снимок экрана от Moon + Reader, чтобы показать выделение текста в нем, который я хочу в моем приложении

2 ответа

Решение

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

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

Нефритовый ридер (на 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);
        }
    }
}

Это зависит от минимальной версии 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 (не считая "сплетения"). Или вы можете реализовать эту функцию самостоятельно, используя пролеты.

Другие вопросы по тегам