Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show copy/paste context menu on text using code android

Tags:

android

I have an EditText and its text gets selected from through code. But I want to allow users to cut/copy the selected text. However, the cut/copy context menu doesn't appear until user long presses on text. But then it loses the actual selection. So, I'm thinking to show the context menu as the text get selected by the code.

I tried this inside onFocusChanged, but nothing appeared.

openContextMenu(EditText);

enter image description here

like image 916
xmen Avatar asked Sep 30 '22 12:09

xmen


1 Answers

IF I follow you usecase correctly, you can open context menu from the onFocusChangeListener registered on the testedEditText.

I prepared some small test for that which seems to be correctly supporting your usecase. You need to openMenu on the hooks which are selecting the content in the 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);
    }
}

}

Weirdly enough registering testedEditText.requestFocus(), and setting onFocusChangedListener for EditText was not enough.

Additional xml files for reference: 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>
like image 61
Patrick Avatar answered Oct 03 '22 01:10

Patrick