Значок приложения ShareActionProvider от AppCompat слишком велик по сравнению с другими значками
Я изменил ActionBarSherlock на AppCompat v7. Я уже сделал все изменения, необходимые для его работы, но что-то странное происходит с иконкой share (которая использует ShareActionProvider). Значок общего доступа слишком большой по сравнению с другими значками. Я также использую библиотеку поддержки для своего поиска, и ее размер правильный. Проблема заключается только в значке share.
![enter image description here]()
my_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:moblee="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_share"
android:padding="10dp"
android:title="@string/menu_share"
moblee:actionProviderClass="android.support.v7.widget.ShareActionProvider"
moblee:showAsAction="always"/>
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"
moblee:actionViewClass="android.support.v7.widget.SearchView"
moblee:showAsAction="always"/>
</menu>
фрагмент:
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.my_menu, menu);
MenuItem item = menu.findItem(R.id.menu_share);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
shareActionProvider.setShareIntent(getDefaultShareIntent());
}
styles.xml
<style name="Theme.Custom" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/main_bar</item>
<item name="colorPrimaryDark">@color/main_bar</item>
<item name="actionBarItemBackground">@drawable/selectable_background_custom</item>
<item name="selectableItemBackground">@drawable/selectable_background_custom</item>
<item name="android:windowBackground">@color/background</item>
<item name="android:popupMenuStyle">@style/PopupMenu.Custom</item>
<item name="android:dropDownListViewStyle">@style/DropDownListView.Custom</item>
<item name="android:actionDropDownStyle">@style/DropDownNav.Custom</item>
<item name="android:actionModeBackground">@drawable/cab_background_top_custom</item>
<item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_custom</item>
<item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Custom</item>
<item name="vpiTabPageIndicatorStyle">@style/VpiTabPageIndicator.Custom</item>
<item name="android:editTextBackground">@drawable/edit_text_holo_light</item>
<item name="android:listChoiceBackgroundIndicator">@drawable/list_selector_holo_light</item>
<item name="android:activatedBackgroundIndicator">@drawable/activated_background_holo_light</item>
<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb_holo</item>
<item name="android:listViewStyle">@style/ListViewCustom</item>
<item name="android:gridViewStyle">@style/GridViewCustom</item>
<item name="android:textViewStyle">@style/TextViewCustom</item>
<item name="android:checkboxStyle">@style/CheckBoxCustom</item>
</style>
<style name="PopupMenu.Custom" parent="@style/Widget.AppCompat.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_dropdown_panel_custom</item>
</style>
<style name="DropDownListView.Custom" parent="@style/Widget.AppCompat.ListView.DropDown">
<item name="android:listSelector">@drawable/selectable_background_custom</item>
</style>
<style name="Theme.Custom.Widget" parent="@style/Theme.AppCompat">
<item name="android:popupMenuStyle">@style/PopupMenu.Custom</item>
<item name="android:dropDownListViewStyle">@style/DropDownListView.Custom</item>
</style>
Ответы
Ответ 1
Решение, которое я закончил, больше не использует ShareContentProvider
, вместо этого я использую Intent.createChooser()
. Это было довольно просто сделать, и он открывает диалоговое окно нового ресурса, как показано ниже:
значок общего доступа в панели действий:
![введите описание изображения здесь]()
Диалог:
![введите описание изображения здесь]()
menu.xml
<item
android:id="@+id/menu_share"
android:checkable="true"
android:icon="@drawable/ic_menu_share"
myapp:showAsAction="always"
android:title="@string/menu_share"/>
Класс фрагмента:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.menu_share) {
showShareDialog();
}
return super.onOptionsItemSelected(item);
}
private void showShareDialog(String message) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, mTitle);
intent.putExtra(Intent.EXTRA_TEXT, mMessage);
startActivity(Intent.createChooser(intent, getString(R.string.menu_share)));
}
Ответ 2
Значки в дизайне материалов 24dp x 24dp, как правильно отражено SearchView
. Тем не менее, ShareActionProvider
по-прежнему не обновляется до материального дизайна.
Вы можете установить actionModeShareDrawable
в своей теме, чтобы установить значок общего доступа в ShareActionProvider
:
<item name="actionModeShareDrawable">@drawable/share_icon</item>
Обратите внимание, что ShareActionProvider
не встречается нигде в руководстве по дизайну материалов и возможности Android M Direct Share (что требует, чтобы в это время вы использовали стандартное соглашение о намерениях), неясно, больше ли ShareActionProvider
предложенный шаблон.
Ответ 3
Единственный способ, которым я нашел, - создать собственный макет для просмотра выбора активности. Я отправился в ActivityChooserView.java и нашел следующие строки:
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.abc_activity_chooser_view, this, true);
Затем я последовал за abc_activity_chooser_view.xml и увидел:
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="android.support.v7.internal.widget.ActivityChooserView$InnerLayout"
android:id="@+id/activity_chooser_view_content"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
style="?attr/activityChooserViewStyle">
<FrameLayout
android:id="@+id/expand_activities_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:focusable="true"
android:addStatesFromChildren="true"
android:background="?attr/actionBarItemBackground">
<ImageView android:id="@+id/image"
android:layout_width="32dip"
android:layout_height="32dip"
android:layout_gravity="center"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
android:layout_marginLeft="12dip"
android:layout_marginRight="12dip"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
</FrameLayout>
<FrameLayout
android:id="@+id/default_activity_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:focusable="true"
android:addStatesFromChildren="true"
android:background="?attr/actionBarItemBackground">
<ImageView android:id="@+id/image"
android:layout_width="32dip"
android:layout_height="32dip"
android:layout_gravity="center"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
android:layout_marginLeft="12dip"
android:layout_marginRight="12dip"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
</FrameLayout>
Как вы можете видеть, размеры представлений изображений 32dp, когда обычно это должно быть 24dp.
EDIT:
Решение прост - вы создаете свой собственный макет с тем же именем и помещаете его в свою папку ресурсов.
Единственное исправление, которое вы должны сделать, чтобы сделать все правильно, - это изменить размер обоих изображений таким образом:
<ImageView android:id="@+id/image"
android:layout_width="24dip"
android:layout_height="24dip"
android:layout_gravity="center"
android:layout_margin="12dip"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
tools:ignore="DuplicateIds"/>
P.S. Имейте в виду, что имена файлов и макеты могут различаться в зависимости от версии app compat lib, но алгоритм один и тот же.