我有一个TextView
,我希望允许用户搜索特定的字符串。如果找到该字符串,则应突出显示。使用背景跨度太慢和笨拙,所以我想弄清楚我是否可以让它选择字符串。我知道使用EditText
这可以使用setSelection()
,但我不希望用户能够编辑文本,同时仍然可以手动突出显示文本,我似乎无法使用EditText
进行管理。
我想,那么它是一个或者;是 是否可以以编程方式选择TextView
或中的文字以允许文字选择,而不允许在EditText
进行编辑?
注意:我实际上正在使用扩展TextView
的自定义视图,所以我假设它是要么延伸EditText
;我只是不确定哪个(如果有的话)会起作用。
答案 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());
}
}