草庐IT

android - 长按 Web View 时水平菜单膨胀器

coder 2023-11-25 原文

我在 longClick 上的 webview 选择有问题。我已经实现了在 longClick 上启动的自定义菜单。但默认菜单也在启动。我正在尝试自定义默认菜单,但我不知道如何捕获用户对项目的点击。

我尝试了以下方法,但是菜单变得垂直并且隐藏了选择,所以我无法选择更多的单词或更改选择。

  @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
{
    super.onCreateContextMenu(menu, v, menuInfo);


    MenuInflater inflater = getMenuInflater();

    /*
        public void inflate (int menuRes, Menu menu)
            Inflate a menu hierarchy from the specified XML resource. Throws InflateException if there is an error.

        Parameters
            menuRes : Resource ID for an XML layout resource to load (e.g., R.menu.main_activity)
            menu : The Menu to inflate into. The items and submenus will be added to this Menu.

    */
    inflater.inflate(R.menu.menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item){
    // Handle the menu item selection
    switch(item.getItemId()){
        case R.id.dict_menu:
            // Render the page again
            Toast.makeText(mContext,"dict_menu",Toast.LENGTH_SHORT).show();
            return true;
        case R.id.q_menu:
            Toast.makeText(mContext,"q_menu",Toast.LENGTH_SHORT).show();
            return true;
        case R.id.hi_menu:
            Toast.makeText(mContext,"hi_menu",Toast.LENGTH_SHORT).show();
            return true;
        default:
            super.onContextItemSelected(item);
    }
    return false;
} 

菜单xml如下。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal">
     <item android:id="@+id/dict_menu"
    android:title="قاموس" />
     <item android:id="@+id/q_menu"
    android:title="اقتباس" />
     <item android:id="@+id/hi_menu"
    android:title="تظليل" />
</menu> 

因此,我没有得到这个结果:(当我没有实现以下方法时,我得到了这个结果:onCreateContextMenu、onContextItemSelected,它们使我能够在选择菜单项时进行捕获)

我得到以下信息:

当我使用以下代码时收到第一个屏幕截图:

@Override
public void onActionModeStarted(ActionMode mode) {
    System.out.println("onActionModeStarted");
    if (mActionMode == null)
    {
        mActionMode = mode;
        //mode.setTitle("Dictionary");
        Menu menu = mode.getMenu();
        menu.clear();
        mode.getMenuInflater().inflate(R.menu.menu, menu);//mode.getMenuInflater().inflate(myMenu, menu);
    }
    //System.out.println("onActionModeStarted");
    super.onActionModeStarted(mode);
}

public void onContextualMenuItemClicked(MenuItem item) {
    System.out.println("onContextualMenuItemClicked");
    switch (item.getItemId()) {
        case R.id.dict_menu:
            // do some stuff
            System.out.println("dict_menu");
        Toast.makeText(mContext,"dict_menu",Toast.LENGTH_SHORT).show();
            break;
        case R.id.hi_menu:
            // do some different stuff
            System.out.println("hi_menu");
          Toast.makeText(mContext,"hi_menu",Toast.LENGTH_SHORT).show();
            break;

        case R.id.q_menu:
            // do some different stuff
            System.out.println("q_menu");
           Toast.makeText(mContext,"q_menu",Toast.LENGTH_SHORT).show();
            break;
        default:
            // ...
            super.onContextItemSelected(item);
            break;
    }

    // This will likely always be true, but check it anyway, just in case
    /*if (mActionMode != null) {
        mActionMode.finish();
    }*/
}

@Override
public void onActionModeFinished(ActionMode mode) {
    mActionMode = null;
    super.onActionModeFinished(mode);
    System.out.println("onActionModeFinished");
}

 <?xml version="1.0" encoding="utf-8"?>
 <!---<menu xmlns:android="http://schemas.android.com/apk/res/android"-->
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal">

     <item android:id="@+id/dict_menu"
         android:onClick="onContextualMenuItemClicked"
         android:title="قاموس" />

     <item android:id="@+id/q_menu"
         android:onClick="onContextualMenuItemClicked"
         android:title="اقتباس" />

     <item android:id="@+id/hi_menu"
         android:onClick="onContextualMenuItemClicked"
         android:title="تظليل" />

 </menu>

这会导致以下错误:

  android.view.InflateException: Couldn't resolve menu item onClick        handler onContextualMenuItemClicked in class android.app.ContextImpl
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:243)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.MenuInflater$MenuState.setItem(MenuInflater.java:464)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.MenuInflater$MenuState.addItem(MenuInflater.java:498)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.MenuInflater.parseMenu(MenuInflater.java:191)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.MenuInflater.inflate(MenuInflater.java:112)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at BookReader.onActionModeStarted(BookReader.java:3346)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at com.android.internal.policy.DecorView.startActionMode(DecorView.java:1034)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at com.android.internal.policy.DecorView.startActionModeForChild(DecorView.java:982)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:828)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:828)
  08-10 09:01:21.602 4931-4931/ W/System.err:     at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:828)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:828)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.view.View.startActionMode(View.java:6398)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at org.chromium.content.browser.SelectionPopupController.showActionModeOrClearOnFailure(SelectionPopupController.java:45)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at org.chromium.content.browser.ContentViewCore.onSelectionEvent(ContentViewCore.java:579)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:7)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.os.Looper.loop(Looper.java:154)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6692)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
  08-10 09:01:21.603 4931-4931/ W/System.err: Caused by: java.lang.NoSuchMethodException: onContextualMenuItemClicked [interface android.view.MenuItem]
  08-10 09:01:21.603 4931-4931/ W/System.err:     at java.lang.Class.getMethod(Class.java:1981)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at java.lang.Class.getMethod(Class.java:1637)
  08-10 09:01:21.603 4931-4931/ W/System.err:     at android.view.MenuInflater$InflatedOnMenuItemClickListener.<init>(MenuInflater.java:241)
  08-10 09:01:21.603 4931-4931/ W/System.err:   ... 22 more
  08-10 09:01:21.604 4931-4931/ A/chromium: [FATAL:jni_android.cc(243)] Please include Java exception stack in crash report

最佳答案

在托管您的 WebView 的任何 Activity 中,覆盖 onActionModeStarted(),操作菜单项,并为每个项分配监听器。一个例子:

@Override
public void onActionModeStarted(ActionMode mode) {
    super.onActionModeStarted(mode);

    MenuInflater menuInflater = mode.getMenuInflater();
    Menu menu = mode.getMenu();

    menu.clear();
    menuInflater.inflate(R.menu.menu_custom, menu);

    menu.findItem(R.id.custom_one).setOnMenuItemClickListener(new ToastMenuItemListener(this, mode, "One!"));
    menu.findItem(R.id.custom_two).setOnMenuItemClickListener(new ToastMenuItemListener(this, mode, "Two!"));
    menu.findItem(R.id.custom_three).setOnMenuItemClickListener(new ToastMenuItemListener(this, mode, "Three!"));
}

private static class ToastMenuItemListener implements MenuItem.OnMenuItemClickListener {

    private final Context context;
    private final ActionMode actionMode;
    private final String text;

    private ToastMenuItemListener(Context context, ActionMode actionMode, String text) {
        this.context = context;
        this.actionMode = actionMode;
        this.text = text;
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
        actionMode.finish();
        return true;
    }
}

关于android - 长按 Web View 时水平菜单膨胀器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45541253/

有关android - 长按 Web View 时水平菜单膨胀器的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby - Ruby 中的选项菜单 - 2

    我正在尝试在Ruby中创建一个菜单,以便根据用户输入的内容,取决于调用的类。然后在这种情况下它将返回到“Main”或类“Options”。我希望有人能帮助我。这是我的代码。modulePhysicsG=21C=20000Pi=3.14D=100endclassOptionsputs"Pleaseselect1forAccelerationand2forEnergy."option=gets()ifoption==1thenputs"AccelCalc"#ThisisthebitthatneedstodirecttheusertotheclassAccelCalcelseputs"Ene

  3. ruby - 下拉菜单在应该被选中的时候没有被选中……为什么? - 2

    我正在尝试解决我们测试中的一个错误,我认为它应该有效。我很确定这是selectize或capybara中的错误,但我不明白为什么。我已经进入了capybara的源代码,一切似乎都在正常工作。我真的不确定如何前进。为了测试这个错误,我已经尽可能地把这个错误剥离成一个小的testapplication.请参阅下面的设置bugs/show.html.erbOneTwoThreeFourOneTwoThreeFourbug_spec.rbfeature'bug'doit"specsetup",js:truedovisitbug_pathfind('div.selectize-inputinpu

  4. ruby-on-rails - 在 Rails 中,如何使用字符串数组实现 HTML 选择菜单? - 2

    我有一个FinancialDocument#document_type模型属性。我想让用户从由字符串数组填充的HTML选择菜单中选择文档类型...doctypes=['Invoice','Packingslip','Other']对于每个选项,显示的标签和返回的值都是相同的。我查看了select和collection_select助手,但它们似乎适合选择子模型,而不仅仅是一个String值。我找不到如何让它们达到我的目的。这是我正在尝试的方法(我使用的是Haml,而不是Erb)...form_for(@financial_document)do|f|-doctypes=['Invoic

  5. ruby - 从 Rails 3.0 升级到 Rails 3.2(Ruby 1.9.3 + Passenger)后出现巨大的内存泄漏/膨胀 - 2

    上周我们将一个在Rails3.0.1上运行的小项目升级到了Rails3.2.2。升级后不久,我们发现偶尔,一天2-3次,我们会看到一个巨大的PhusionPassenger进程(1-5GB)。我们正在运行PhusionPassenger3.0.11和Ruby1.9.3-p0。我们已经尝试了不同的Ruby版本(1.9.2-p290和1.9.3-p125)但没有成功。之后,我们尝试使用Oink来跟踪我们的内存使用情况.不幸的是,Oink没有显示内存膨胀的原因——大型进程似乎不再写入日志文件。当我们降级回Rails3.0.1时,问题就消失了。有没有人有类似的问题?我们确实检查了我们的代码是否

  6. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  7. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  8. ruby - OS X 中作为守护进程运行的脚本的菜单栏图标? - 2

    我有一个ruby​​脚本(https://github.com/daemonza/MacBak)作为守护进程在我的macbook上运行并监视一堆目录的文件更改和rsync发生的任何更改。我想知道我能否让它在顶部的菜单栏中创建一个图标?只是为了让我知道它确实在运行,而不必使用ps检查它。也许以后如果需要的话,我可能希望能够从那里控制脚本,简单的带有停止和状态条目的下拉菜单等。从ObjectC看来我可以调用NSStatusItem来获取图标,但我真的只是想通过我的Ruby脚本轻松地完成它。也许我可以做一些applescript调用? 最佳答案

  9. ruby-on-rails - 创建许多新对象时内存膨胀 - 2

    当我运行它然后在OSX事件监视器中观察我的ruby​​进程的内存消耗时,内存以大约3MB/s的速度增加。如果我删除事务,内存消耗量将减半,但内存占用量仍会继续增加。我的生产应用程序有一个问题,Heroku由于内存消耗而终止了进程。有没有一种方法可以在不增加内存的情况下执行以下操作?如果我注释掉.save行,那没关系,但这当然不是解决方案。ActiveRecord::Base.transactiondo10000000.timesdo|time|puts"----#{time}----"a=Activity.new(:name=>"#{time}Activity")a.save!(:va

  10. ruby-on-rails - Ruby on Rails : allow the user to enter a new information, 或单击下拉菜单选择现有信息 - 2

    这里是新的ROR程序员。我正在尝试构建一个Web应用程序,该应用程序允许用户填写表单,他们在其中输入公司信息,然后通过单击提交,将输入添加到数据库中。目前,如果用户要创建一个新条目,他们会看到几个字段,例如“公司名称”。有一个空白框供他们输入新公司,旁边有一个下拉菜单,用户可以使用该菜单查看数据库中的现有公司。"SelectaCompany")%>我正在寻找一种允许用户输入新公司的方法,或者单击下拉菜单并选择现有公司。目前:如果未在文本框中输入任何内容且未从下拉列表中选择任何选项,则将其保存为空白。如果输入了一些内容,但没有选择任何选项,它将被保存为空白。但是,如果输入内容并从下拉列表

随机推荐