如何在充气视图上显示上下文菜单?

时间:2011-03-22 12:38:38

标签: android view contextmenu

我想为膨胀的视图显示上下文菜单。这是代码示例:

for grid_layout.xml:

<?xml version="1.0" encoding="utf-8"?>    
    <ImageView
            xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerInside"
        android:antialias="true" />

现在我在我的活动课程中使用它:

  @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {       
            menu.setHeaderTitle("Select action");       
            menu.add(0, 1, 0, "Action1");
            menu.add(0, 2, 0, "Action2");

            super.onCreateContextMenu(menu, v, menuInfo);
    }

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ImageView imageView = (ImageView) inflater.inflate(R.layout.grid_layout, null);
    imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               registerForContextMenu(v);
                       openContextMenu(v);
            }

        });

此代码运行时没有任何错误,但单击imageView时不显示上下文菜单。这段代码有什么问题吗?

3 个答案:

答案 0 :(得分:4)

我找到了针对这种情况的解决方法并解决了我的问题。 正如我所说,相同的代码工作正常并显示ContextMenu,如果我在我在setContentView()方法中设置的XML中定义ImageView。我只是使用该imageView的对象来注册contextMenu并在点击膨胀项目时显示ContextMenu。以下是示例代码:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {       
            menu.setHeaderTitle("Select action");       
            menu.add(0, 1, 0, "Action1");
            menu.add(0, 2, 0, "Action2");

            super.onCreateContextMenu(menu, v, menuInfo);
    }

    ImageView imageViewInContext = (ImageView) findViewById(R.id.imageview_in_main_xml);
    registerForContextMenu(imageViewInContext);

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ImageView imageView = (ImageView) inflater.inflate(R.layout.grid_layout, null);
    imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {                   
                 openContextMenu(imageViewInContext);
            }

        });

希望这会对某人有所帮助!

答案 1 :(得分:1)

添加您的代码:

imageView.setFocusable(true);
imageView.setClickable(true);

之后,Imageview将获得clickEvent。

答案 2 :(得分:0)

因为您正在创建一个匿名内部类(通过执行new View.OnClickListener),所以您不再在UI线程(您的Activity类)中操作,因此当您想要{{1}时,不会加载上下文菜单}和registerForContextMenu。您可以使用openContextMenu向UI线程(您的Activity类)发送消息来执行这些操作,或者尝试在内部类中引用您的Activity类。像这样:

Handler