2015-06-17 4 views
13

Ich habe den ActionBarSherlock in AppCompat v7 geändert. Ich habe bereits alle Änderungen vorgenommen, die nötig sind, damit es funktioniert, aber mit dem Share-Icon (das ShareActionProvider verwendet) passiert etwas Seltsames. Das Share-Symbol ist zu groß im Vergleich zu anderen Symbolen. Ich benutze auch die Support-Bibliothek für meine Suche, und seine Größe ist korrekt. Das Problem ist nur mit dem Teilen-Symbol.AppCompat ShareActionProvider-Symbol ist zu groß im Vergleich zu anderen Symbolen

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> 

Fragment:

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> 

Antwort

4

Die Lösung, die ich verwendet habe, ist nicht mehr ShareContentProvider verwenden, stattdessen verwende ich Intent.createChooser().Es war ziemlich einfach, diese Veränderungen zu tun, und es öffnet sich das neue Freigabe-Dialog, wie unten dargestellt:

Aktien-Symbol in der Aktionsleiste:

enter image description here

Dialog:

enter image description here

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

Fragment-Klasse:

@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))); 
} 
13

Icons in Materialdesign sind 24dp x 24dp, wie von der SearchView richtig wiedergegeben. ShareActionProvider wurde jedoch noch nicht standardmäßig auf Materialdesign aktualisiert.

Sie actionModeShareDrawable in Ihrem Thema einstellen können das Aktiensymbol in der ShareActionProvider einzustellen:

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

Beachten Sie, dass ShareActionProvider nicht überall in den Material-Design-Richtlinien und mit Android M Direct Share Fähigkeit gefunden wird (die Sie erfordert verwenden eine Standard-Aktienabsicht zu diesem Zeitpunkt), ist unklar, ob das ShareActionProvider ein vorgeschlagenes Muster mehr ist.

+3

Danke für die Antwort, es hat geholfen, aber die Lösung hat nicht funktioniert. Ich habe ein benutzerdefiniertes Freigabesymbol eingerichtet, das jedoch weiterhin zu groß war. Ich habe dann ein neues benutzerdefiniertes Freigabesymbol mit transparenten Rahmen erstellt. Aber meine letzte Lösung war das Erstellen einer neuen Freigabe mit Intent.createChooser(). – heloisasim

+1

Danke Ian. Jemand sollte wirklich update.android.com/training/sharing/ aktualisieren. Direct Share wird dort nicht erwähnt. –

+0

@ianhanniballake - irgendwelche Ideen? http://stackoverflow.com/questions/34995278/size-of-shareaction-icon-issue-on-actionbar-with-shareactionprovider-v7 – Mohsen

3

Die einzige Möglichkeit, die ich gefunden habe, war mein eigenes Layout für die Aktivitätsauswahlansicht zu erstellen. Ich ging zu ActivityChooserView.java und fand nächsten Zeilen:

LayoutInflater inflater = LayoutInflater.from(getContext()); 
    inflater.inflate(R.layout.abc_activity_chooser_view, this, true); 

Dann folgte ich zu abc_activity_chooser_view.xml und sah:

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

Wie Sie die Größen sehen können Bildansichten sind 32dp, wenn es normalerweise 24dp sein sollte.

EDIT:

Die Lösung ist einfach - Sie Ihr eigenes Layout mit exakt dem gleichen Namen erstellen und in Ihre Ressourcen Ordner. Die einzige ammendment was du tun musst die Dinge richtig zu machen ist wie diese Größe der beiden Bildansichten zu ändern:

   <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. Beachten Sie, dass Dateinamen und Layouts abhängig von der app compatate lib-Version variieren können, aber der Algorithmus ist derselbe.

+0

Netter Fang. Ich schlage vor, dass Sie das vollständige Code-Segment entfernen und nur auf die Änderungen hinweisen, da sich diese Datei bereits in meinem Build geändert hat und eine manuelle Bearbeitung erforderlich ist. Immer frustrierend, wie viele dieser Hacks ich implementiert habe, um Android-Fehler zu verwalten. Ich muss sie verfolgen, so dass ich mich daran erinnern kann, sie zu entfernen, wenn sie das Problem später in zwei Versionen beheben. Ich habe einen Fehlerbericht für dieses Problem gesendet. – Anthony

+0

Dies funktioniert nicht für mich. Ich mache ein neues Layout mit dem gleichen Namen wie das verwendete (wie beschrieben) und es sieht so aus, als ob es mein Layout einfach ignoriert und das existierende verwendet - muss ich etwas Besonderes tun, um Layouts zu überschreiben den gleichen Namen haben? –

+0

@MalcolmMacLeod Nichts besonderes. 1) Stellen Sie sicher, dass Sie dem Layout des Aktivitätswählers den richtigen Namen geben. Wenn Sie in ActivityChooserView.java nachsehen und die Zeile finden, in der das Layout aufgebläht wird, könnte sich dies geändert haben. 2) Stellen Sie sicher, dass Sie die Layout-Datei in den richtigen Ordner (Sie haben möglicherweise viele dieser in Ihrem Projekt mit verschiedenen Ressourcen-Modifikatoren, zB "Layout-groß", etc.) – asamoylenko

Verwandte Themen