getActionProvider:item未实现SupportMenuItem

 Yafei2702933480 发布于 2023-01-09 12:00

我正在尝试ShareActionProvider在片段中的上下文操作栏中使用支持库来实现.我在正常的操作栏(onCreateOptionsMenu())中没有遇到任何问题,但是当我在CAB(MultiModeListener接口中的onCreateActionMode())中尝试它时,我收到错误:

getActionProvider: item does not implement SupportMenuItem; returning null

通过https://cells-source.cs.columbia.edu/plugins/gitiles/platform/frameworks/support/+/30837f1095c803f332f4a1c3f0917c8afdd50156/v4/java/android/support/v4/view/MenuItemCompat.java查看Android源代码,问题似乎是因为我MenuItem不是以下的实例SupportMenuItem:

 public static ActionProvider getActionProvider(MenuItem item) {
    if (item instanceof SupportMenuItem) {
        return ((SupportMenuItem) item).getSupportActionProvider();
    }

    // TODO Wrap the framework ActionProvider and return it
    Log.w(TAG, "getActionProvider: item does not implement SupportMenuItem; returning null");
    return null;
}

关于如何解决这个问题的任何想法?

清单:


            
                
                
                
            

活动:

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

public class myactivity_ActionBarActivity extends ActionBarActivity{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actionbaractivity_layout); //loads a fragment

    }
}

片段:

import android.support.v7.widget.ShareActionProvider;
import android.support.v4.view.MenuItemCompat;
import android.view.MenuItem;
import android.view.Menu;
import android.support.v4.app.Fragment;

...
...

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    ...
    ...
    //Handle Action mode events
    myListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
        private ShareActionProvider mShareActonProvider;
        ....
        ....
        @Override
        public boolean onCreateActionMode(ActionMode mode,
        Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.chatsession_contextmenu, menu);

            //get the ShareActionProvider from the menu item
            MenuItem item = menu.findItem(R.id.share_menu);
            mShareActonProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);

            return true;
        }
    }

    ...
    ...
}

菜单布局文件:


    
        
        

        
            

    

编辑1:

问题的根源似乎Menu是作为参数传递给onCreateActionMode(ActionMode mode, Menu menu)和的对象的差异onCreateOptionsMenu(Menu menu, MenuInflater inflater).只有一个人才onCreateOptionsMenuMenuWrapperICS.以下是调试模式下两个对象的屏幕截图:

onCreateActionMode(ActionMode mode, Menu menu) :

在此输入图像描述

onCreateOptionsMenu(Menu menu, MenuInflater inflater) :

在此输入图像描述

1 个回答
  • 问题是MultipleModeListener界面扩展了android.view.ActionMode.Callback,如http://androidxref.com/4.4.2_r2/xref/frameworks/base/core/java/android/widget/AbsListView.java#6301中的源代码所示.如果您使用ShareActionProvider支持库,则需要使用支持库android.support.v7.view.ActionMode.Callback.

    解决方案是创建自己的ActionMode.CallBack实现,而不是使用框架MultipleModeListener.这样,您可以确保在需要的地方使用支持库.

    例如 :

      导入的V7版本ActionMode,并ActionBarActivity在您的片段

      import android.support.v7.view.ActionMode;
      import android.support.v7.app.ActionBarActivity;
      

      onClickListener为列表视图创建一个并用于startSupportActionMode启动自定义ActionMode.CallBack实现

      myListView.setItemsCanFocus(false);
      myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
      actionMode = null;
      myListView.setOnItemClickListener(new OnItemClickListener(){
          @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                      if(myListView.getCheckedItemCount() == 0){
                          actionMode.finish();
                          return;
                      }
      
                          if(actionMode == null){
                              actionMode = ((ActionBarActivity)getActivity()).startSupportActionMode(new ContextualActionBar());
                          }
      
                  }
              });
      

      创建自定义ActionMode.Callback实现

      private class ContextualActionBar implements ActionMode.Callback{
          private ShareActionProvider mShareActionProvider;
      
          @Override
          public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
              switch(item.getItemId()){
      
              case R.id.share_menu :
                  mode.finish();
                  return true;
      
              default :
                  return false;
              }
          }
      
          @Override
          public boolean onCreateActionMode(ActionMode mode, Menu menu) {
              MenuInflater inflater = mode.getMenuInflater();
              inflater.inflate(R.menu.chatsession_contextmenu, menu);
      
              //Initialize the ShareActionProvider
              MenuItem shareMenuItem = menu.findItem(R.id.share_menu);
              mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareMenuItem);
              Intent shareIntent = new Intent(Intent.ACTION_SEND);
              shareIntent.setType("text/plain");
              shareIntent.putExtra(Intent.EXTRA_TEXT, "test message");
              mShareActionProvider.setShareIntent(shareIntent);
              return true;
          }
      
          @Override
          public void onDestroyActionMode(ActionMode mode) {
              //Nullify the actionMode object 
              //so that the onClickListener can identify whether the ActionMode is ON  
              actionMode = null;
      
              //Uncheck all checked messages 
              SparseBooleanArray selectedItems = myListView.getCheckedItemPositions();
              for(int i=0;i<selectedItems.size();i++){
                  myListView.setItemChecked(selectedItems.keyAt(i), false);
              }
          }
      
          @Override
          public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
              // TODO Auto-generated method stub
              return false;
          }
      
      }
      

    2023-01-09 12:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有