【问题标题】:AppCompat ShareActionProvider icon is too big compared to other iconsAppCompat ShareActionProvider 图标与其他图标相比太大
【发布时间】:2020-02-02 15:28:16
【问题描述】:

我将 ActionBarSherlock 更改为 AppCompat v7。我已经完成了使其工作所需的所有更改,但是共享图标(使用 ShareActionProvider)发生了一些奇怪的事情。与其他图标相比,共享图标太大。我也使用支持库进行搜索,它的大小是正确的。问题只是共享图标。

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>

【问题讨论】:

    标签: android android-actionbar android-appcompat


    【解决方案1】:

    材料设计中的图标是24dp x 24dp,正如SearchView 所正确反映的那样。不过ShareActionProvider默认还没有更新到Material Design。

    您可以在您的主题中设置actionModeShareDrawable 以在ShareActionProvider 中设置分享图标:

    <item name="actionModeShareDrawable">@drawable/share_icon</item>
    

    请注意,ShareActionProvider 在材料设计指南中的任何地方都找不到,并且由于 Android M 的 Direct Share 功能(此时需要您使用标准共享意图),尚不清楚 ShareActionProvider 是否是建议的模式没有了。

    【讨论】:

    • 感谢您的回答,它确实有帮助,但解决方案不起作用。我设置了一个自定义共享图标,但它仍然太大。然后我创建了一个带有透明边框的新自定义共享图标。但实际上,我的最终解决方案是使用 Intent.createChooser() 创建一个新共享。
    • 谢谢伊恩。真的应该有人更新 developer.android.com/training/sharing/ 。那里没有提到直接共享。
    • @ianhanniballake - 有什么想法吗? stackoverflow.com/questions/34995278/…
    【解决方案2】:

    我最终使用的解决方案不再使用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)));
    }
    

    【讨论】:

      【解决方案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

      编辑:

      解决方案很简单 - 您创建自己的布局并使用完全相同的名称并将其放入资源文件夹中。 要使事情正确,您必须做的唯一修改是更改两个图像视图的大小,如下所示:

                      <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"/>
      

      附:请注意,文件名和布局可能会因应用兼容 lib 版本而异,但算法是相同的。

      【讨论】:

      • 不错的收获。我建议您删除完整的代码段并指出更改,因为该文件在我的构建中已经更改并且需要手动编辑。令人沮丧的是,我已经实施了多少这些黑客来管理 Android 缺陷。我必须跟踪它们,以便在他们最终解决两个版本后的问题时记得将它们删除。我已为此问题提交了错误报告。
      • 这对我不起作用。我制作了一个与正在使用的布局同名的新布局(如所述),它似乎只是忽略了我的布局并使用现有的布局 - 我需要做一些特别的事情来告诉它覆盖具有同名?
      • @MalcolmMacLeod 没什么特别的。 1)确保您为活动选择器布局提供正确的名称。查看 ActivityChooserView.java 并找到它扩展其布局的行,它可能已经改变。 2)确保你把布局文件放在正确的文件夹中(你的项目中可能有许多具有不同资源修改器的布局文件,例如“layout-large”等)
      • @MalcolmMacLeod *资源限定符
      • @MalcolmMacLeod >> platforms/android-21/data/res/layout/activity_chooser_view.xml 好吧,这可能意味着两件事:1)您不使用您项目中 support.v7 库中的工具栏和上述解决方法不适用于工具栏的框架实现; 2)您混合了布局并修改了布局的框架版本,而不是 support.v7 中的版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2022-09-25
      • 2012-10-10
      相关资源
      最近更新 更多