【问题标题】:Android: menu option ShareAction versionsAndroid:菜单选项 ShareAction 版本
【发布时间】:2015-03-17 18:03:34
【问题描述】:

它编译时没有错误,但我在活动崩溃后在运行时得到这个:

 java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
        at android.support.v7.internal.view.menu.MenuItemImpl.getActionProvider(MenuItemImpl.java:645)
        at com.......Activity.onCreateOptionsMenu

代码行在onCreateOptionsMenu()中

shareProvider = (ShareActionProvider) item.getActionProvider();

它说要使用 MenuItemCompat.getActionProvider() 但它在另一个导入中,我有 minSdkVersion 15,targetSdkVersion 21

这是活动

import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ShareActionProvider;
import android.widget.TextView;
import android.widget.Toast;

public class Activity extends ActionBarActivity implements AdapterView.OnItemLongClickListener 
 {
    private ShareActionProvider shareProvider;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        MenuItem item = menu.findItem(R.id.action_share);
        shareProvider = (ShareActionProvider) item.getActionProvider();
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent shareIntent = new Intent(Intent.ACTION_SEND)
                          .putExtra(Intent.EXTRA_TEXT, "text");
        setShareIntent(shareIntent);
        return true;
    }

    private void setShareIntent(Intent shareIntent) {
        if (shareProvider != null) 
             shareProvider.setShareIntent(shareIntent);
    }
}

菜单

<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.......Activity">
    <item android:id="@+id/action_share"
    android:title="Share" app:showAsAction="ifRoom"
    android:icon="@android:drawable/ic_menu_share"
    android:actionProviderClass="android.widget.ShareActionProvider" />
</menu>

【问题讨论】:

    标签: android android-intent share android-optionsmenu


    【解决方案1】:

    当你使用ActionBarActivity时,你必须使用android.support.v7.widget.ShareActionProvider而不是android.widget.ShareActionProvider

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

    然后按照错误消息的暗示使用MenuItemCompat.getActionProvider()

    请注意,ShareActionProvider 仅在调用 setShareIntent() 后才变为可点击 - 您应该尽快执行此操作(在 onCreateOptionsMenu() 或您要共享的内容已加载/选择/准备好时,而不是在onOptionsItemSelected()

    【讨论】:

    • 谢谢。它没有崩溃,但仍然无法正常工作,因为共享按钮不可点击。是否像我在创建菜单和选择项目时所做的那样正确?
    • 在地址变为可点击时更新了我的答案 - 您需要尽快致电setShareIntent
    • 另外,ShareActionProvider 只有在您的内容有可能的共享目标时才可点击。在您的情况下,永远不会有任何共享目标,因为您没有在 Intent 中指定 MIME 类型。使用setType("text/plain") 分享纯文本。
    • 好的,所以我在 onCreateOptionsMenu 和 onOptionsItemSelected 中准备了意图,我必须只做 startActivity(shareIntent)?共享符号旁边有一个奇怪的红色符号和一些白色三角形是否很常见?这是可点击的,但不是另一个。
    • 您不会在 onOptionsItemSelected() 中为 ShareActionProvider 做任何事情 - 它会为您做任何事情。根据ShareActionProvider training,出现在分享按钮旁边的图标是处理该意图的最后/最高排名的应用程序。我怀疑您只是在没有 mime 类型时看到了一个剩余的符号。
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2015-07-13
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多