代码之家  ›  专栏  ›  技术社区  ›  Eran Goldin

support.v7如果showAsAction=“always”,ShareActionProvider将崩溃

  •  3
  • Eran Goldin  · 技术社区  · 10 年前

    正在尝试使用 ShareActionProvider 从支持库(v7)中,如果我不设置 showAsAction 属性。我的意图是将此菜单项显示为图标,而不是溢出项。

    然而,如果我将其设置为始终显示,则应用程序将崩溃 NullPointerException .


    07-30 01:23:37.778: E/AndroidRuntime(25853): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageDrawable(android.graphics.drawable.Drawable)' on a null object reference
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.internal.widget.ActivityChooserView.updateAppearance(ActivityChooserView.java:510)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.internal.widget.ActivityChooserView$3.onChanged(ActivityChooserView.java:247)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.internal.widget.ActivityChooserView$ActivityChooserViewAdapter.setDataModel(ActivityChooserView.java:647)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.internal.widget.ActivityChooserView.setActivityChooserModel(ActivityChooserView.java:260)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.widget.ShareActionProvider.onCreateActionView(ShareActionProvider.java:182)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v4.view.ActionProvider.onCreateActionView(ActionProvider.java:109)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.support.v7.internal.view.menu.MenuItemWrapperJB$ActionProviderWrapperJB.onCreateActionView(MenuItemWrapperJB.java:44)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.MenuItemImpl.getActionView(MenuItemImpl.java:583)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:161)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:438)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1062)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:87)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:216)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:244)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:956)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.view.menu.MenuBuilder.startDispatchingItemsChanged(MenuBuilder.java:979)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:479)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.view.Choreographer.doFrame(Choreographer.java:543)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.os.Handler.handleCallback(Handler.java:733)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.os.Handler.dispatchMessage(Handler.java:95)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.os.Looper.loop(Looper.java:136)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at android.app.ActivityThread.main(ActivityThread.java:5001)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at java.lang.reflect.Method.invoke(Native Method)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    07-30 01:23:37.778: E/AndroidRuntime(25853):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    

    我的菜单布局:main.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.myapp.MainActivity" >
    
        <item
            android:id="@+id/menu_item_share"
            android:title="Share"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
            app:showAsAction="always"/>
    
    </menu>
    

    我在活动中的通货膨胀代码:

    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.widget.ShareActionProvider;
    
    public class MainActivity extends ActionBarActivity 
    {
        ...
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) 
        {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
    
            // Locate MenuItem with ShareActionProvider
            MenuItem item = menu.findItem(R.id.menu_item_share);
    
            // Fetch and store ShareActionProvider
            _shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
            setShareIntent();
    
            return true;
        }
    }
    

    谢谢

    4 回复  |  直到 10 年前
        1
  •  1
  •   Jonguo    10 年前

    今天我遇到了这个问题,这是一个支持v7lib的bug。

    如果必须使用support v7 lib,我找到了两种方法来解决这个问题。

    1. 将支持库更新到最新版本。目前最新的是android 5.0 v7库,我已经测试了这个库,并修复了这个bug。

    2. 如果您不想更新support v7 lib,应该在共享项菜单xml中将app:showAsAction更改为android:showAsAction。我花了很多时间来找到这个解决方案。

        2
  •  0
  •   ProjectJourneyman    10 年前

    我认为你的shareintent设置不正确(但我只是从你发布的代码中猜测)。您应该在actionprovider本身上调用setShareIntent,现在您正在单独调用一行上的某个未知函数setShareInten()。相反,尝试

        _shareActionProvider().setShareIntent(/*some intent*/);
    

    我认为,当shareintent提供程序试图加载第一个共享选项的图标时,NPE就无法处理没有从中提取图像的意图。只有当提供程序显示在操作栏中时,才会出现此问题。

        3
  •  0
  •   user1942887    10 年前

    如下设置xml项:

       <item
        android:id="@+id/menu_item_share"
        android:title="Share" 
        support:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        support:showAsAction="always"/>
    
        4
  •  0
  •   kajtam    9 年前

    xml项

     <item
        android:id="@+id/action_share"
        android:title="@string/anction_share"
        android:orderInCategory="2"
        app:showAsAction="always"
      app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
    

    价值声明

     private android.support.v7.widget.ShareActionProvider shareActionProvider;
    

    代码中使用

    MenuItem menuItem = menu.findItem(R.id.action_share);
    shareActionProvider = (android.support.v7.widget.ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
    setIntent("Example text.");
    

    setIntent方法

      private void setIntent(String text){
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, text);
        shareActionProvider.setShareIntent(shareIntent);
    }