繁体   English   中英

如何在Android中为新菜单项设置onclicklistener

[英]How to make onclicklistener for new menu item in android

我正在添加一个用于文本选择的菜单项。 通常它显示剪切,复制,共享等。我在此菜单中又添加了一个项目,并将该项目命名为“标记”。

为此,我在Activity.Java中添加了以下代码

@Override
public void onActionModeStarted(ActionMode mode) {
    if (mActionMode == null) {
        mActionMode = mode;
        Menu menu = mode.getMenu(); 
        menu.add("Mark");
        mode.getMenuInflater().inflate(R.menu.main, menu);
    }
    super.onActionModeStarted(mode);
}

长按文本时,我可以获取菜单项。以下是反映我的菜单项的屏幕。

在此处输入图片说明

对于此菜单项,我想在选择它时做一些事情。 因此,我使用了以下代码。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if( item.getTitle().equals("Mark")){
        System.out.println("MenuItem Mark clicked----");
        Log.d("MenuItem  clicked----", "Mark");          
    }
    return super.onOptionsItemSelected(item);
}

在这里,我无法在Logcat中收到消息“ MenuItem Mark clicked ----”或“ MenuItem clicked ---- Mark”。

我该怎么办?

更新

跟随Elitz的回答,但仍然没有运气。 我的以下更改

@Override
public void onActionModeStarted(ActionMode mode) {
    if (mActionMode == null) {
        mActionMode = mode;
        Menu menu = mode.getMenu();  
        menu.add(0,1000,0,"Mark");
        mode.getMenuInflater().inflate(R.menu.main, menu);
    }
    super.onActionModeStarted(mode);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == 1000) {
         System.out.println("MenuItem Mark clicked----");
         Log.d("MenuItem  clicked----", "Mark");
    }         
    return super.onOptionsItemSelected(item);
}

添加了更新的答案,但Logcat中仍然没有消息

private ActionMode.Callback startActionMode = (new ActionMode.Callback() {

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu yourMenu) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }       
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu yourMenu) {
        return false;
    }       
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem yourMenu) {
        Log.d("MenuItem  clicked----303", "Mark");
        if (yourMenu.getItemId() == R.attr.actionModeSelectAllDrawable) {
             System.out.println("MenuItem Mark clicked----305");
             Log.d("MenuItem  clicked----", "Mark");
        }         
        return true;
    }
});

UPDATE2

也跟随安克什(Ankesh)的回答,

@Override
public void onActionModeStarted(ActionMode mode) {
    if (mActionMode == null) {
        mActionMode = mode;
        Menu menu = mode.getMenu();  
        menu.add(R.id.privateText);
        mode.getMenuInflater().inflate(R.menu.main, menu);
    }
    super.onActionModeStarted(mode);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.privateText) {
         System.out.println("MenuItem Mark clicked----");
         Log.d("MenuItem  clicked----", "Mark");
    }         
    return super.onOptionsItemSelected(item);
}

两者都尝试没有可用的日志...

UPDATE3

为了测试其他菜单,我在R,java中找到了selectAll菜单项的ID,并尝试了以下代码,

@Override
public boolean onOptionsItemSelected(MenuItem item) {           if (item.getItemId() == R.attr.actionModeSelectAllDrawable) {
         System.out.println("MenuItem All clicked----");
         Log.d("MenuItem  clicked----", "All");
    }         
    return super.onOptionsItemSelected(item);
}

这也不会在Logcat中显示该消息。 此功能对菜单项选择是否正确? 还是我在这方面还缺少什么?

用它代替你的menu.add("Mark");

add(int groupId, int itemId, int order, CharSequence title);

现在您有了自己的Id现在可以进行检查。

groupId = 0; order = 0; ,或任何适合您选择的数字,但是由于在您的示例中您只有1个组,因此只需输入0。

嗯..我想你让我们都愚弄了:)是的,它是行不通的,因为你使用ActionMode权,并与ActionMode你需要为它指定一个回调,所以你应该在这里把你的代码

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem arg1) {
        return false;
    }

在其回调中。 就像这样,当您调用startActoinMode时

startActionMode(new ActionMode.Callback() {

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu yourMenu) {
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }       
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu yourMenu) {
        return false;
    }       
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem yourMenu) {
        //put your item click here
        return false;
    }
});

采用

if (item.getItemId() == R.id.xyz) { 

}

您可以仅将菜单项添加到xml菜单中(我的意思是在R.menu.main )吗? 然后,只需检测项目,请在此方法内单击:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item_id:
            //TODO click detected!!
            break
            default:
                return super.onOptionsItemSelected(item);
        }
    }

这就是我不明白你的问题:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM