【问题标题】:support.v7 ShareActionProvider crashes if showAsAction="always"support.v7 ShareActionProvider 如果 showAsAction="always" 崩溃
【发布时间】:2014-07-29 22:48:59
【问题描述】:

尝试使用支持库 (v7) 中的 ShareActionProvider,如果我没有为菜单项设置 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;
    }
}

谢谢。

【问题讨论】:

    标签: android android-layout android-actionbar android-actionbar-compat android-actionbaractivity


    【解决方案1】:

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

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

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

    2. 如果您不想更新支持 v7 库,则应在您的共享项目菜单 xml 中将 app:showAsAction 更改为 android:showAsAction。我花了很多时间才找到这个解决方案。

    【讨论】:

      【解决方案2】:

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

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

      我认为 NPE 是当 shareintent 提供者尝试为第一个共享选项加载图标时,并且无法处理没有意图从中提取图像的情况。如果提供程序显示在操作栏中,您只会遇到此问题。

      【讨论】:

      • 我已放弃使用支持库。使用常规 ShareActionProvider 我的代码运行良好。所以我在想——支持库错误。
      【解决方案3】:

      像这样设置 xml 项:

         <item
          android:id="@+id/menu_item_share"
          android:title="Share" 
          support:actionProviderClass="android.support.v7.widget.ShareActionProvider"
          support:showAsAction="always"/>
      

      【讨论】:

      • 也请提供一些解释,不仅要为 OP 提供工作代码,还要教他一些东西。
      • 这和我做的一模一样。这只是使用自定义命名空间而不是“android:”,因为这些属性在目标版本中不存在。你可以称它为“支持”,但它是一样的。
      【解决方案4】:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2014-04-30
        • 2014-06-07
        • 1970-01-01
        相关资源
        最近更新 更多