【问题标题】:How to show contextmenu on inflated view?如何在膨胀视图上显示上下文菜单?
【发布时间】:2011-03-22 12:38:37
【问题描述】:

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

对于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 时上下文菜单不显示。这段代码有什么问题吗?

【问题讨论】:

标签: android view contextmenu


【解决方案1】:

我找到了解决这种情况的方法并解决了我的问题。 正如我所说,如果我在 setContentView() 方法中设置的 XML 中定义 ImageView,则相同的代码可以正常工作并显示 ContextMenu。我只是使用该 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);
            }

        });

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

【讨论】:

    【解决方案2】:

    添加你的代码:

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

    之后 Imageview 将获得 clickEvent。

    【讨论】:

    • Imageview 正在获取点击事件并执行 onclickListener 中的代码,但仍然没有显示 contextMenu。
    • 如果我在 setContentView() 方法中设置的 XML 中定义 ImageView,则相同的代码可以正常工作。但我需要在膨胀的视图上进行。
    【解决方案3】:

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

    activityClassName.this.registerForContextMenu(v);
    activityClassName.this.openContextMenu(v);
    

    【讨论】:

    • 我已经尝试过了,但是没有用。如果我在 setContentView() 方法中设置的 XML 中定义 ImageView,则相同的代码可以正常工作。但我需要在膨胀的视图上进行。
    • 在这种情况下,您的充气想法似乎无法正常工作。鉴于 imageView 是一个小部件,我认为您不应该为此使用 LayoutInflater。你试过 View 的静态方法 View.inflate 吗? developer.android.com/reference/android/view/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多