2015-10-06 42 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); 
} 
相关问题