2015-10-06 39 views
16
使用圖標和文字顯示菜單項

我試着在XML文件中不同的組合:如何AppCompatActivity

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="ifRoom|withText" /> 
</menu> 

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="always|withText" /> 
</menu> 

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="withText" /> 
</menu> 

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" /> 
</menu> 

我試圖programmaticly

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ 
     MenuItem item = menu.add(R.string.menu_create_alarm); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT|MenuItem.SHOW_AS_ACTION_IF_ROOM); 
     item.setIcon(R.drawable.ic_action_accept); 
     item.setOnMenuItemClickListener(
      new OnMenuItemClickListener(){ 

       @Override 
       public boolean onMenuItemClick(MenuItem item){ 
        saveAlarm(); 
        return true; 
       } 
      } 
     ); 


//  inflater.inflate(R.menu.menu_create_alarm, menu); 
     super.onCreateOptionsMenu(menu, inflater); 

    } 

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" 
     app:showAsAction="always|withText" /> 
</menu> 

然而,似乎唯一的圖標來設置。因爲沒有設置工具欄標題,所以房間有點plant,。刪除菜單並用工具欄中的按鈕替換菜單是不可修改的。
如何顯示文字?

+0

http://stackoverflow.com/questions/14932216/action-bar-sub-menu-item-with-text-and-image-not-working-pr運作 – vab

+0

@vab喲使鏈接到答案,解決方案已列出,不工作 – Yarh

+0

圖標+文本或只有文本? – XxGoliathusxX

回答

13

您需要添加tools:context="your class"菜單標籤

menu.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".activities.BaseActivity"> 


    <item 
     android:id="@+id/action_notification1" 
     android:icon="@drawable/three" 
     android:title="action_notification" 
     app:showAsAction="always"> 
     <menu> 
      <item 
       android:id="@+id/profile" 
       android:icon="@drawable/profile" 
       android:orderInCategory="100" 
       android:title="PROFILE" /> 

      <item 
       android:id="@+id/c" 
       android:icon="@drawable/correct_tick" 
       android:orderInCategory="100" 
       android:title="COMPLETED TRIPS" /> 

      <item 
       android:id="@+id/app" 
       android:icon="@drawable/report_issue" 
       android:orderInCategory="100" 
       android:title="REPORT ISSUES" /> 
      <item 
       android:id="@+id/r" 
       android:icon="@drawable/correct_tick" 
       android:orderInCategory="100" 
       android:title="REACHED CENTER" /> 


      <item 
       android:id="@+id/pdf" 
       android:icon="@drawable/pdf_image" 
       android:orderInCategory="100" 
       android:title="BAG INFO" /> 
      <item 
       android:id="@+id/l" 
       android:icon="@drawable/logout" 
       android:orderInCategory="100" 
       android:title="LOGOUT" /> 
     </menu> 
    </item> 


</menu> 

覆蓋onCreateOptionsMenu()

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    menu.getItem(0).getSubMenu().getItem(3).setVisible(false); 
    menu.getItem(0).getSubMenu().getItem(4).setVisible(true); 
    return super.onCreateOptionsMenu(menu); 
} 

你shold編寫工具:上下文菜單標籤那麼RU n您將得到圖標文本

1

嘗試把這兩個連接在一起

app:showAsAction="always|withText" 
android:showAsAction="always|withText" 
+0

仍然沒有文字,只有圖標 – Yarh

+0

雖然此鏈接可能回答這個問題,最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – JohanShogun

+2

鏈接在哪裏@JohanShogun爵士 – Elltz

6

XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" 
     app:showAsAction="always|withText" /> 
</menu> 

的java:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.menu_frg_safetybox, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
+1

仍然沒有文字,只有圖標 – Yarh

+0

Android如果可以在一天結束時自行決定適合與否。 –

+0

如何調用,新的充氣器在片段?如果我做@Override \t public void onCreateOptionsMenu(Menu Menu,MenuInflater inflater){ // \t \t inflater.inflate(R.menu.menu_create_level,menu); \t \t new MenuInflater(getActivity())。inflate(R.menu.menu_create_level,menu); \t \t super.onCreateOptionsMenu(menu,inflater); \t},我仍然只有圖標 – Yarh

1

'總是| withText' 如果有足夠的空間將工作,否則將只放置圖標。通過將手機旋轉到橫向模式,您可以看到。

 <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_launcher" 
     android:title="Save" 
     app:showAsAction="always|withText" 
     /> 
+0

這是正確的。如果我將設備轉換爲橫向模式,文字將顯示出來。不過,我想文字總是顯示。雖然我在工具欄中的標題非常短(「活動」),但文本不會顯示。 – murt

9
protected boolean onPrepareOptionsPanel(View view, Menu menu) { 
    if (menu != null) { 
     if (menu.getClass().getSimpleName().equals("MenuBuilder")) { 
      try { 
       Method m = menu.getClass().getDeclaredMethod(
         "setOptionalIconsVisible", Boolean.TYPE); 
       m.setAccessible(true); 
       m.invoke(menu, true); 
      } catch (Exception e) { 
       Log.e(getClass().getSimpleName(), 
         "onMenuOpened...unable to set icons for overflow menu", 
         e); 
      } 
     } 
    } 
    return super.onPrepareOptionsPanel(view, menu); 
} 
+0

當我的類擴展活動,這工作形式我:http://stackoverflow.com/a/22288914/555762。 但是,當我改變我的課程擴展AppCompatActivity,以前的解決方案停止工作,這個答案保存了我的一天=) –

+0

非常感謝。我們需要在proguard中做出什麼改變? – Atul

+0

@Atul我沒有測試它的proguard,但不認爲progurad需要一些變化,因爲這一點。 –

4
@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
//  getMenuInflater().inflate(R.menu.menu_patient_home_screen, menu); 


     menu.add(0, 1, 1, menuIconWithText(getResources().getDrawable(R.mipmap.user_2), getResources().getString(R.string.action_profile))); 
     menu.add(0, 2, 2, menuIconWithText(getResources().getDrawable(R.mipmap.add_user), getResources().getString(R.string.action_add_user))); 
     menu.add(0, 3, 3, menuIconWithText(getResources().getDrawable(R.mipmap.switch_profile), getResources().getString(R.string.action_switch_profile))); 
     menu.add(0, 4, 4, menuIconWithText(getResources().getDrawable(R.mipmap.logout), getResources().getString(R.string.action_sign_out))); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     switch (item.getItemId()) { 
      case 1: 
       Toast.makeText(PatientHomeScreen.this, "Profile is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 2: 
       Toast.makeText(PatientHomeScreen.this, "Add New User is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 3: 
       Toast.makeText(PatientHomeScreen.this, "Switch Profile is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 4: 
       Toast.makeText(PatientHomeScreen.this, "Sign Out is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    private CharSequence menuIconWithText(Drawable r, String title) { 

     r.setBounds(0, 0, r.getIntrinsicWidth(), r.getIntrinsicHeight()); 
     SpannableString sb = new SpannableString(" " + title); 
     ImageSpan imageSpan = new ImageSpan(r, ImageSpan.ALIGN_BOTTOM); 
     sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     return sb; 
    } 

Screen shot of emulator

希望這將幫助你

+0

以上解決方案工作良好,如果您正在使用片段,則只需更改一件事,使用onCreateOptionsMenu(Menu Menu,MenuInflater inflater)更改onCreateOptionsMenu(菜單菜單)。 並在onCreate(Bundle savedInstanceState)或View onCreateView(LayoutInflater inflater ....)中添加setHasOptionsMenu(true) –

2

添加到answer從dev_ry,有沒有使用反射僅通過鑄造和抑制更平滑的方式受限API警告:

import android.support.v7.view.menu.MenuBuilder; 

@SuppressLint("RestrictedApi") 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if (menu instanceof MenuBuilder) { 
     ((MenuBuilder) menu).setOptionalIconsVisible(true); 
    } 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return super.onCreateOptionsMenu(menu); 
} 
相關問題