2013-08-15 5 views
7

Mam jeden element, który chcę zawsze wyświetlać na pasku akcji, używając biblioteki AppCompat. To tylko podmenu wykorzystujące domyślny obraz przepełnienia.AppCompat - pozycja nie jest wyświetlana na pasku działań dla poziomów API v8-13

Nie działa to dla mnie na poziomach interfejsu API w wersji 8-13. Zrobiłem wszystko, co napisałem w przewodniku dla programistów, w tym dodałem własną przestrzeń nazw.

Używam niestandardowego stylu, którego motywem jest Theme.AppCompat (poniżej).

To jest mój pierwszy post, więc nie mam wystarczającej liczby punktów reputacji, aby opublikować zdjęcie z działania, ale brakuje tego elementu na pasku akcji, a menu pojawia się na dole po naciśnięciu przycisku menu.

Wszelkie opinie będą bardzo mile widziane!

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myproject" 
    android:installLocation="auto" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <application 
     android:debuggable="true" 
     android:icon="@drawable/my_app_icon" 
     android:label="@string/app_name" 
     android:theme="@style/CustomActionBarTheme" > 
     <uses-library android:name="com.google.android.maps" /> 

     <activity 
      android:name=".ui.MainActivity" 
      android:label="@string/app_name" 
      android:launchMode="singleTop" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:MyApp="http://schemas.android.com/apk/res-auto" > 

    <item 
     android:id="@+id/overflow" 
     MyApp:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_dark" 
     MyApp:showAsAction="always" 
     android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_dark" 
     android:showAsAction="always"> 
     <menu> 
      <item 
       android:id="@+id/action_about" 
       android:icon="@drawable/about_icon" 
       android:title="About"/> 
      <item 
       android:id="@+id/action_feedback" 
       android:icon="@drawable/feedback_icon" 
       android:title="Feedback"/> 
      <item 
       android:id="@+id/action_settings" 
       android:icon="@drawable/settings_icon" 
       android:title="@string/action_settings"/> 
     </menu> 
    </item> 

</menu> 

styles.xml

<resources> 
    <style name="CustomActionBarTheme" parent="@style/Theme.AppCompat"> 
     <item name="android:actionBarStyle">@style/MyActionBar</item> 
     <item name="actionBarStyle">@style/MyActionBar</item> 
    </style> 

    <style name="MyActionBar" parent="@style/Widget.AppCompat.ActionBar"> 
     <item name="android:titleTextStyle">@style/TitleTextStyle</item> 
     <item name="android:background">@drawable/abc_ab_bottom_solid_dark_holo</item> 
     <item name="titleTextStyle">@style/TitleTextStyle</item> 
     <item name="background">@drawable/abc_ab_bottom_solid_dark_holo</item> 
    </style> 

    <style name="TitleTextStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"> 
     <item name="android:textStyle">bold</item> 
    </style> 
</resources> 

MainActivity.java

package com.myproject; 
... 
public class MainActivity extends BaseActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreateEqually(savedInstanceState); 
     ActivityHelper.setLayoutTitle(this, R.layout.main, R.string.main, getSupportActionBar()); 
    } 

    ... 

} 

BaseActivity.java

package com.myproject; 

import android.support.v7.app.ActionBarActivity; 
... 

public class BaseActivity extends ActionBarActivity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    public boolean onCreateOptionsMenu(Menu menu) { 
     return true; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     return MenusHelper.displayMenu(this, menu); 
    } 

    ... 
} 

MenusHelper.java

package com.myproject; 
... 

public final class MenusHelper { 

    ... 

    public static boolean displayMenu(BaseActivity currentActivity, Menu menu) { 
     // clear former menus 
     menu.clear(); 
     MenuInflater inflater = new MenuInflater(currentActivity); 
     inflater.inflate(R.menu.menu, menu); 

     return true; 
    } 

    ... 
} 

ActivityHelper.java

package com.myproject; 

import android.support.v7.app.ActionBar; 
... 

public final class ActivityHelper { 
    ... 

    public static void setLayoutTitle(Activity activity, int layoutId, String titleStr, ActionBar actionBar) { 
     activity.setContentView(layoutId); 
     actionBar.setTitle(titleStr); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

} 
+0

można umieścić swój kod Java, jak również? –

+0

Dodałem powyższy kod Java. – jah15

+0

możliwy duplikat [paska czynności nie pokazanego z AppCompat] (http://stackoverflow.com/questions/18510337/actionbar-not-shown-with-appcompat) – flx

Odpowiedz

11

spróbować umieścić kod MenusHelper.displayMenu(this, menu); do onCreateOptionsMenu() zamiast onPrepareOptionsMenu() a także wykonać niezbędne modyfikacje.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu, menu); 

    // In case you have an item 
    MenuItem shareItem = menu.findItem(R.id.menu_share); 

    // To retrieve the Action Provider 
    mActionProvider = (ShareActionProvider) 
    MenuItemCompat.getActionProvider(shareItem); 

    return super.onCreateOptionsMenu(menu); 
} 

Upewnij się, że menu w XML wygląda następująco:

<item 
    android:id="@+id/share" 
    android:title="@string/menu_share" 
    yourapp:actionProviderClass="android.support.v7.widget.ShareActionProvider" 
    yourapp:showAsAction="ifRoom|withText"/> 
+0

Dzięki! Nadmuchałem menu w 'onCreateOptionsMenu()' zamiast w 'MenusHelper.displayMenu() 'i zadziałało! Początkowo wywoływałam go w 'onPrepareOptionsMenu()', aby włączyć/wyłączyć pewne podpozycje na podstawie bieżącej aktywności. Jeszcze raz dziękuję wszystkim! – jah15

7

problemem jest to

android:showAsAction="always" 

że musi być

youpackagename:showAsAction="always" 

rzeczywiście patrząc na nią znowu ogłosił, że dwa razy

android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_dark" 
android:showAsAction="always" 

usunąć ten nieco

+0

Dziękuję za sugestię, ale to nie rozwiązało problemu! Jakieś inne pomysły? Dodałem kod Java powyżej. Dzięki! – jah15