dev*_*ost 6 android shareactionprovider
我正在使用ShareActionProvider,但我想自定义图标(我想改变颜色,因为目前它是白色的).
我正在使用此代码:
mShareActionProvider = (ShareActionProvider) item.getActionProvider();
Intent myIntent = new Intent(Intent.ACTION_SEND);
myIntent.setType("text/plain");
myIntent.putExtra(Intent.EXTRA_TEXT, str_share);
mShareActionProvider.setShareIntent(myIntent);
Run Code Online (Sandbox Code Playgroud)
XML:
<item
android:id="@+id/menu_item_share"
android:showAsAction="ifRoom"
android:title="@string/titlePartager"
android:actionProviderClass="android.widget.ShareActionProvider"
android:icon="@drawable/ic_share"/>
Run Code Online (Sandbox Code Playgroud)
如何更改图标(或颜色)?
谢谢,
编辑/简答:如果使用AppCompat的ShareActionProvider,只需actionModeShareDrawable在主题定义中提供一个新的.
<style name="MyTheme" parent="Theme.AppCompat">
<item name="actionModeShareDrawable">@drawable/my_share_drawable</item>
</style>
Run Code Online (Sandbox Code Playgroud)
如果不使用AppCompat,则此资源是为Lollipor或更新版本定义的,但不适用于以前的版本.
下面是本机的答案ShareActionProvider(这是这个问题的原始范围).
要更改此图片,您应该更改actionModeShareDrawable应用主题的值.看看的ShareActionProvider的onCreateActionView()方法:
public View onCreateActionView() {
// Create the view and set its data model.
...
// Lookup and set the expand action icon.
TypedValue outTypedValue = new TypedValue();
mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId);
...
Run Code Online (Sandbox Code Playgroud)
不幸的是这个属性是不是在Android框架公众(虽然它是如果使用兼容库,如程序兼容性或ActionBarSherlock).在这种情况下,只需要覆盖主题的价值.
如果您不使用这些库,那么唯一的解决方案(我所知道的)就是创建ShareActionProvider该onCreateActionView()方法的子类并重新实现该方法.然后你可以使用你想要的任何可绘制的东西.
编辑然而,由于实现onCreateActionView()使用其他不公开的类,这使事情变得更加复杂.为避免重复大量代码,您只需通过反射更改图标,如下所示:
public class MyShareActionProvider extends ShareActionProvider
{
private final Context mContext;
public MyShareActionProvider(Context context)
{
super(context);
mContext = context;
}
@Override
public View onCreateActionView()
{
View view = super.onCreateActionView();
if (view != null)
{
try
{
Drawable icon = ... // the drawable you want (you can use mContext to get it from resources)
Method method = view.getClass().getMethod("setExpandActivityOverflowButtonDrawable", Drawable.class);
method.invoke(view, icon);
}
catch (Exception e)
{
Log.e("MyShareActionProvider", "onCreateActionView", e);
}
}
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
与任何涉及反射的解决方案一样,如果ShareActionProvider将来内部实施变更,这可能会很脆弱.
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |