有没有办法以编程方式在TextView中选择文本?

时间:2014-05-01 17:50:03

标签: android android-edittext textview textselection

我有一个TextView,我希望允许用户搜索特定的字符串。如果找到该字符串,则应突出显示。使用背景跨度太慢和笨拙,所以我想弄清楚我是否可以让它选择字符串。我知道使用EditText这可以使用setSelection(),但我不希望用户能够编辑文本,同时仍然可以手动突出显示文本,我似乎无法使用EditText进行管理。

我想,那么它是一个或者;是 是否可以以编程方式选择TextView 中的文字以允许文字选择,而不允许在EditText进行编辑?

注意:我实际上正在使用扩展TextView的自定义视图,所以我假设它是要么延伸EditText;我只是不确定哪个(如果有的话)会起作用。

1 个答案:

答案 0 :(得分:0)

不确定问题是否仍然存在,我将提供我的解决方案。对来自搜索引擎的人来说可能会有用。

因此,据我所知,目的是选择TextView中的所有文字,而无法修改其内容。我没有检查它对非常大的文本有多有效,但希望不是那么糟糕。

请注意,API版本应为> = 11

import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.text.Selection;
import android.text.Spannable;
import android.util.AttributeSet;

public class SelectableTextView extends TextView
{
    public SelectableTextView(Context context)
    {
        super(context);
        init();
    }

    public SelectableTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init()
    {
        if (Build.VERSION.SDK_INT > 10)
            setTextIsSelectable(true);
    }

    @Override
    public boolean onTextContextMenuItem(int id)
    {
        switch (id)
        {
            case android.R.id.cut:
                return true;

            case android.R.id.paste:
                return true;

            case android.R.id.shareText:
            {
                String selectedText = getText().toString().substring(getSelectionStart(), getSelectionEnd());

                if (selectedText != null && !selectedText.isEmpty())
                {
                    Intent sendIntent = new Intent();
                    sendIntent.setAction(Intent.ACTION_SEND);
                    sendIntent.putExtra(Intent.EXTRA_TEXT, selectedText);
                    sendIntent.setType("text/plain");
                    sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    getContext().startActivity(sendIntent);
                }

                return true;
            }

            case android.R.id.selectAll:
            {
                selectAllText();
                return true;
            }
        }

        return super.onTextContextMenuItem(id);
    }

    public void selectAllText()
    {
        if (Build.VERSION.SDK_INT > 10)
            Selection.setSelection((Spannable) getText(), 0, length());
    }

}