2012-05-31 103 views
15

我试图设置图标ShareActionProvider,需要一个纯白色的而不是半透明的白色。设置操作栏上的自定义共享图标ShareActionProvider

但是,在share_menu.xml和代码中的设置不起作用。想知道是否有人在扩展ShareActionProvider之前解决了这个问题。 (我使用actionbarsherlock)

@Override 
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 
    inflater.inflate(R.menu.share_menu, menu); 
    MenuItem actionItem = menu.findItem(R.id.share_action_provider); 

    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider(); 
    actionProvider.setShareIntent(mShareIntent); 

    // re-setting the icon as it's not being picked up from the menu xml file 
    actionItem.setIcon(R.drawable.ic_action_share); 

    super.onCreateOptionsMenu(menu, inflater); 

} 

share_menu.xml

<item android:id="@+id/share_action_provider" 
     android:showAsAction="ifRoom" 
     android:title="@string/share_with" 
     android:icon="@drawable/ic_action_share" 
     android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" /> 

更新: 还试图在风格上设置它,但没有喜悦

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
     <item name="actionModeStyle">@style/ActionModeStyle</item> 
     <item name="android:actionModeStyle">@style/ActionModeStyle</item> 
</style> 

<style name="ActionModeStyle" parent="Widget.Sherlock.ActionMode"> 
     <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
    </style> 

回答

17

当我期待自定义操作栏,通常我看的第一个地方是ActionBarSherlock主题和样式。

我发现Sherlock主题使用theme.xml文件中的“actionModeShareDrawable”。

尝试更改主题以直接包含“actionModeShareDrawable”项目。

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
    <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
</style> 
+8

这只会在内部版本在所有平台上使用时才起作用。内置的'ShareActionProvider'使用非公共资源来指定drawable,所以这个解决方案非常适合ActionBarSherlock。 –

+3

将actionModeShareDrawable添加到主题中,似乎对姜饼和ics都有效。 – scottyab

+2

在JB或GB上对我没有影响。 –

1

您可以重写像这样的非公开属性。

<style name="Theme.MyApp" parent="android:Theme.Holo"> 
     <item name="*android:actionModeShareDrawalbe">@drawable/icon</item> 
</style> 

(*)指的Android

+1

此选项会导致各种设备崩溃。非常不鼓励使用非公开的Android属性。 –

+3

那么对于非Sherlock主题有没有解决方案?我使用扩展Holo.Light的自定义主题。事情是,我的分享行动图标必须是白色的,而不是Holo.Light的深灰色图标。 我试图覆盖非公开的属性如图所示,但我的设备崩溃开始.no需要进一步测试:)。所以..其他解决方案? – bajicdusko

7

参照非公共资源对于AppCompat需要变化至2种样式:

1)

<style name="MyAppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <item name="actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
    <item name="android:actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
</style> 

换句话说,在您的MyAppTheme中指定attr:actionModeShareDrawable不是您真正需要的,但应该在您的中提及210如下:

2)

<style name="Theme.AppCompat.CustomShareIcon" parent="@style/Theme.AppCompat"> 
    <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item> <!-- your icon goes here --> 
</style> 
6

UPDATE:忘记下面的取巧的办法,只是子类ShareActionProvider,在onCreateActionView方法返回null,并在menu.xml文件文件提供自己的图标,一切将被罚款

===========================

我发现了一个很棘手,但没有-ActionBarSherlock特定的方式:

  1. 子类ShareActionProvider,只是一个小调整:

    @Override 
    public View onCreateActionView() { 
        View target = super.onCreateActionView(); 
        ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.actionbutton_share, null); 
        ImageView overlay = (ImageView) viewGroup.findViewById(R.id.overlay); 
        ViewGroup container = (ViewGroup) viewGroup.findViewById(R.id.container); 
        container.addView(target); 
        container.getLayoutParams().width = overlay.getLayoutParams().width; 
        container.getLayoutParams().height = overlay.getLayoutParams().height; 
        return viewGroup; 
    } 
    
  2. 创建一个布局文件(R.layout.actionbutton_share),其将原来的视图在顶部,但对用户透明(注意“机器人:阿尔法= 0" 的一部分):

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" 
        android:orientation="vertical" > 
    
        <FrameLayout 
         android:id="@+id/container" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:alpha="0" /> 
    
        <ImageView 
         android:id="@+id/overlay" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:layout_marginLeft="7dp" 
         android:layout_marginRight="7dp" 
         android:src="@drawable/yours_whatever_share_icon" 
         tools:ignore="ContentDescription" /> 
    
    </RelativeLayout> 
    
  3. 使用砍死ShareActionProvider在您的菜单。xml文件

+0

超级。重写和返回Null工作得很漂亮 – LumberHack

+1

继承,返回null的想法应该是自己的答案。它为我工作。这个答案写的方式首先是令人困惑的。 –

3

vivimice的解决方案是好的,但最近使用的应用程序的共享图标被隐藏起来了。

我做了定制的共享图标为一个共同的菜单项目没有任何ShareActionProvider,只是在onOptionsItemSelected()方法中使用此代码:

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 
sendIntent.setType("text/plain"); 
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))); 

它创建不是一个弹出菜单,而是一个选择对话框。