在Android中使用代码显示文本的复制/粘贴上下文菜单

6

我有一个 EditText,它的文本是通过代码选择的。但我想允许用户剪切/复制所选的文本。然而,剪切/复制上下文菜单直到用户长按文本才会出现。但这样就失去了实际的选择。因此,我想在文本被代码选择时显示上下文菜单。

我尝试在 onFocusChanged 中做这个操作,但没有出现任何东西。

openContextMenu(EditText);

enter image description here

1个回答

4

如果我正确理解您的用例,您可以从注册在testedEditText上的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>

没有资源'android.R.menu.cmenu'。Eclipse显示错误。我担心在未来的版本中可能会出现问题。资源名称可能会更改。+1为了好的尝试。 - xmen
我添加了缺失的资源:
  1. 菜单放在/res/menu中
  2. 第二个只是一个布局。
- Patrick
2
我认为它不会显示与屏幕截图中显示的快速操作菜单相同的菜单,而是使用ListView创建一个普通的上下文菜单。 - xmen
是的,那是一些自定义视图,我在想问题只是将其连接到某些事件上。所以问题是你也需要这个视图吗? - Patrick
我只需要显示快速操作栏,即设备的默认操作栏。我认为它不能直接从API中调用。 - xmen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接