2014-12-08 2 views
5

바 바로 아래가 아닌 하위 메뉴를 표시해야합니다. 활동에안드로이드 작업 표시 줄 하위 메뉴는 바 아래가 아닌 작업 표시 줄 위에 표시됩니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_pages" 
     android:orderInCategory="1" 
     android:showAsAction="withText|always" 
     android:icon="@drawable/ic_action_pages" 
     android:title=""> 
     <menu> 
      <item android:id="@+id/item1" android:title="Placeholder"></item> 
     </menu> 
    </item> 
</menu> 

아래에있는 내 액션 바 XML을 복사

평소처럼

public boolean onCreateOptionsMenu(Menu menu) { 
    if (!mNavigationDrawerFragment.isDrawerOpen()) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     restoreActionBar(); 
     return true; 
    } 
    return super.onCreateOptionsMenu(menu); 
} 
+0

이것을 알아 냈습니까? – JackyBoi

+0

동일한 문제가 발생했습니다 (Android 5.1). 안드로이드를 개발하는 동안 여기저기서 그러한 "기능"을 우연히 발견 한 지 몇 년 후, 안드로이드는 매우 초조 한 플랫폼이라고 말해야합니다. – Stan

답변

1

서문

(APP는 네비게이션 서랍이있다), 나는 이상한 문제가있는 동안 직면 Android 앱을 개발하고 해결책을 찾으려 고이 질문에 착수했습니다. 전에 많은 경우였던 것처럼 대답이 없습니다. 그래서 처음부터 문제를 해결하고 현재 해결 방법으로 답변을 게시하도록 강요당했습니다.

입력 내가 작업 표시 줄 및 드롭 다운 메뉴로 확장 할 필요가 일부 메뉴 항목과 안드로이드 응용 프로그램을 가지고있다. 첫 번째 시도는 Android 설명서에 제안 된대로 구현하는 것이 었습니다. 그래서 나는 그것으로 기존의 작업 표시 줄 메뉴 및 하위 menu 용기에 새 메뉴 항목 menu_sort 추가 : 하위 메뉴가 상단에 표시됩니다 효과가 정확히 질문에 설명 된

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/id1" android:icon="@drawable/ic_1" 
     android:title="@string/id1" android:showAsAction="withText|always"/> 
    ... 

    <item 
    android:id="@+id/menu_sort" 
    android:icon="@drawable/ic_menu_sort_selector" 
    android:title="&#x25BE;" 
    android:titleCondensed="&#x25BE;" 
    android:showAsAction="withText|always"> 
    <menu> 
     <item 
      android:id="@+id/menu_sort_by_name" 
      android:showAsAction="never" 
      android:checkable="true" 
      android:checked="true" 
      android:title="@string/sort_by_name"/> 
     <item 
      android:id="@+id/menu_sort_by_priority" 
      android:showAsAction="never" 
      android:checkable="true" 
      android:checked="false" 
      android:title="@string/sort_by_priority"/> 
     <item 
      android:id="@+id/menu_sort_by_memory" 
      android:showAsAction="never" 
      android:checkable="true" 
      android:checked="false" 
      android:title="@string/sort_by_memory"/> 
    </menu> 
    </item> 
</menu> 

결과 액션 바의 여기에 안드로이드 5.1.1에서 찍은 스크린 샷입니다 : 나는 많은 옵션과 코드 조각으로 연주

problem with dropdown submenu on top of its parent action bar

는 - 아무것도 도움이되지 않습니다. 마지막으로 나는 별도의 메뉴 레이아웃, 말, menu/sorting.xml에 모든 하위 메뉴를 이동하고, 메인 메뉴 (위 그림 참조)의 menu_sort 항목에서 제거의

다음과 같은 솔루션

먼저왔다.

둘째, 수정 또는 다음 코드로 onPrepareOptionsMenu 이벤트 핸들러 작성 : 여기

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    // as solution utilizes PopupMenu, 
    // take care about older Android versions if necessry 
    // if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 

    // here goes most crazy part: we use menu id 
    // to retrieve corresponding view, automatically created by OS; 
    // imho, this is a hack, and menu item should have getView() method or similar; 
    View menuItemView = findViewById(R.id.menu_sort); 

    // by the way, menuItemView could probably be null under some circumstances 

    // create a popup anchored to the view (menu item) 
    final PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
    // API 14 
    // popupMenu.inflate(R.menu.sorting); 
    // API 11 (HONEYCOMB) 
    popupMenu.getMenuInflater().inflate(R.menu.sorting, popupMenu.getMenu()); 

    // process popup clicks as appropriate 
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
    { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) 
    { 
     switch(item.getItemId()) 
     { 
     // ... place some code 
     } 
     return true; 
    } 
    }); 

    // bind the popup to the item menu 
    menu.findItem(R.id.menu_sort).setOnMenuItemClickListener(new OnMenuItemClickListener() 
    { 
    @Override 
    public boolean onMenuItemClick(MenuItem item) 
    { 
     popupMenu.show(); 
     return true; 
    } 
    }); 

    return super.onPrepareOptionsMenu(menu); 
} 

이 결과를 : 처음부터 예상대로

properly positioned dropdown submenu under action bar - workaround

이제 드롭 다운이 표시됩니다.

+0

onPptareOptionsMenu 대신 onOptionsItemSelected에 리스너를 사용하는 것이 더 좋습니다. – JFouad

+0

@JFouad, 나는 당신이 그 문제를 이해하고 있는지 확신하지 못합니다. 당신의 제안은 부적절한 것이지 잘못된 말은 아닙니다. – Stan

+0

는이 코드 ' menu.findItem (R.id.menu_sort) .setOnMenuItemClickListener에게 (새 OnMenuItemClickListener를 이동하는 것이 좋습니다() { @Override 공공 부울 onMenuItemClick (MenuItem의 항목) { popupMenu.show(); true를 반환; } }); ' onPrepareOptionsMenu에서 onOptionsItemSelected까지 – JFouad

3

간단히. 스탠의 솔루션은 나를 위해 작동하지 않습니다 @

<style name="AppTheme" parent="AppBaseTheme"> 
    <item name="actionOverflowMenuStyle">@style/OverflowMenu</item> 
</style> 

<style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow"> 
    <!-- Required for pre-Lollipop. --> 
    <item name="overlapAnchor">false</item> 

    <!-- Required for Lollipop. --> 
    <item name="android:overlapAnchor">false</item> 
</style> 

+0

위대한 감사를드립니다! android : overlapAnchor는 API 레벨 15 (타겟팅 대상)에서 지원되지 않으므로이 XML을 res/values-v21/styles.xml 파일에 넣어야합니다. 그런 다음 android : overlapAnchor 설정을 삭제했습니다. 나의 정상적인 res/values ​​/ styles.xml. 이것은 오류와 경고를 제거하고, 지금은 잘 작동합니다! – HanClinto

0

, 그래서 여기에 액션 바의 상단에 하위 메뉴를 구현하는 내 방식이다 (그러나 물론 메인 메뉴 아래) :
I 2 xml 파일을 만들었습니다 : menu_main.

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

<!-- our addMenu doesn't have sub-items--> 
<item 
    android:id="@+id/action_add" 
    android:icon="@drawable/ic_note_add_white_24dp" 
    android:title="@string/action_add" 
    app:showAsAction="ifRoom"/> 

<!-- our moreMenu which show drop-down menu when clicked--> 
<item 
    android:id="@+id/action_more" 
    android:icon="@drawable/ic_more_vert_white_24dp" 
    android:title="@string/action_more" <!--in text: "more"--> 
    app:showAsAction="always"/> 

</menu> 


그리고 두 번째 'menu_more.xml : XML
menu_more.xml 고해상도/메뉴 디렉토리


첫 번째'menu_main.xml이 '에 위치한
메뉴를 포함 '드롭 다운 메뉴가 포함되어 있습니다.

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

<!-- This menu will be hidden by default--> 
<!-- But will be visible when moreMenu with '@+id/action_more' is clicked--> 
<item 
    android:id="@+id/action_settings" 
    app:showAsAction="ifRoom|withText" 
    android:title="@string/action_settings" <!-- In text: "Settings"--> 
    android:visible="true"/> 

</menu> 


NUS의 모습 :

공공 부울 onPrepareOptionsMenu (메뉴 메뉴)

:
result-after-add-2-xmls이 활동에서
(나는 이미지를 표시하는 것만으로는 충분하지 10 평판을 가지고), 난이 방법을 무시했습니다
이전 방법에서는 메인 메뉴 항목에 대한 참조를 얻습니다.이 경우 @ + id/action_more가 인 메뉴가 m 인 메뉴입니다.) 파일을 enu_main.xml, 다음에 setOnMenuItemClickListener을 설정하고 마지막으로 선언하고 관리하는 는 PopupMenu 인스턴스를 설정 디스플레이 하위 메뉴 항목 :

// show popup menu when menuMore clicked 
menu.findItem(R.id.action_more).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() 
{ 
    @Override 
    public boolean onMenuItemClick(MenuItem item) 
    { 
     // get reference to menuMore item 
     View menuMore = findViewById(item.getItemId()); 
     // create a popup anchored to the view (menuMore) 
     // notes: if declare and set up PopupMenu Outside of this onMenuItemClick() 
     // then it'll not work! 
     // Because: the view you put into PopupMenu() could be null 
     final PopupMenu popupMenu = new PopupMenu(getApplicationContext(), menuMore); 
     // inflate 'menu_more.xml' layout file 
     // which contain all sub-items of menu 
     popupMenu.getMenuInflater().inflate(R.menu.menu_more, popupMenu.getMenu()); 

     // process popup clicks on sub-items 
     popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
     { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) 
      { 
       switch(item.getItemId()){ 
        case R.id.action_settings: 
         Toast.makeText(getApplicationContext(), "showing SettingsActivity..", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        // more items go here 
       } 
       return true; 
      } 
     }); 

     popupMenu.show(); 
     return true; 
    } 
}); 

return super.onPrepareOptionsMenu(menu); 


그리고 최종 결과는 다음과 같습니다.
final-look-drop-down-menu