我有一个EditText
,其文字是通过代码选择的。但我想允许用户剪切/复制所选文本。但是,在用户长按文本之前,不会显示剪切/复制上下文菜单。但它失去了实际的选择。所以,我正在考虑在代码选择文本时显示上下文菜单。
我在onFocusChanged中尝试了这个,但没有出现。
openContextMenu(EditText);
答案 0 :(得分:4)
如果我正确地使用了usecase,您可以从在measuredEditText上注册的onFocusChangeListener打开上下文菜单。
我准备了一些小测试,似乎正确支持你的用例。 您需要在正在选择EditText中的内容的钩子上打开菜单。
public class Main extends Activity {
private EditText testedEditText;
private Button selectingButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
selectingButton = (Button) findViewById(R.id.button);
testedEditText = (EditText) findViewById(R.id.textView);
registerForContextMenu(testedEditText);
selectingButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testedEditText.setSelection(6, 11);
openContextMenu(testedEditText);
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.cmenu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.select_all:
return true;
case R.id.copy:
//do something
return true;
case R.id.cut:
//do something
return true;
case R.id.paste:
//do something
return true;
default:
return super.onContextItemSelected(item);
}
}
}
奇怪的是,注册testedEditText.requestFocus()
并为EditText设置onFocusChangedListener
是不够的。
其他xml文件供参考: cmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/select_all"
android:title="select all"
/>
<item android:id="@+id/copy"
android:title="copy"
/>
<item android:id="@+id/cut"
android:title="cut"
/>
<item android:id="@+id/paste"
android:title="paste"
/>
</menu>
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World, Initial Text..."
android:layout_centerInParent="true"
/>
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="button"
/>
</RelativeLayout>