Настройка значка пользовательского общего доступа на панели действий 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 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>
Ответы
Ответ 1
Когда я ищу настроить панель действий, обычно первое, что я смотрю, это темы и стили ActionBarSherlock.
Я обнаружил, что тема Шерлока использует "actionModeShareDrawable" как найденный в theme.xml.
Попробуйте изменить тему, чтобы включить элемент "actionModeShareDrawable".
<style name="Theme.MyApp" parent="Theme.Sherlock.Light">
<item name="actionModeShareDrawable">@drawable/ic_action_share</item>
</style>
Ответ 2
Для 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>
Другими словами, указание attr:actionModeShareDrawable
в вашем MyAppTheme
не то, что вам действительно нужно, но оно должно упоминаться в вашем attr:actionBarWidgetTheme
следующим образом:
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>
Ответ 3
UPDATE: забудьте о TRICKY ниже, просто подкласс класса ShareActionProvider, верните null в onCreateActionView
Method и укажите свой собственный значок в файле menu.xml, все будет хорошо
===========================
Я нашел очень сложный, но не-ActionBarSherlock-специфический способ:
-
Подкласс класса 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;
}
-
Создайте файл макета (R.layout.actionbutton_share), который поместит исходный вид сверху, но прозрачен для пользователя (обратите внимание на часть "android: alpha = 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>
-
Используйте взломанный файл ShareActionProvider в файле menu.xml
Ответ 4
Решение 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)));
Создает не всплывающее меню, а диалог выбора.
Ответ 5
Вы можете переопределить непубличный атрибут следующим образом.
<style name="Theme.MyApp" parent="android:Theme.Holo">
<item name="*android:actionModeShareDrawalbe">@drawable/icon</item>
</style>
(*) означает ссылку на негосударственные ресурсы в Android