2017-11-04 24 views
0

Toolbar에는 "설정"항목이 하나 있고 오른쪽에 햄버거 아이콘이있는 DrawerLayout 메뉴가 있습니다.오른쪽 서랍의 메뉴 항목 및 햄버거 버튼 위치 변경

는 이제 다음과 같습니다

enter image description here

내가 같이, 햄버거 오른쪽에 있어야 할 :

enter image description here

menu.xml :

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

    <item 
     android:id="@+id/settings" 
     android:icon="@drawable/ic_settings_black_48dp" 
     app:showAsAction="always" /> 
</menu> 

MainActivity :

public class MainActivity extends AppCompatActivity { 
    private DrawerLayout mDrawerLayout; 
    //EndDrawerToggle is class for setup DrawerLayout with an end-aligned drawer 
    private EndDrawerToggle drawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     context=this; 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); 
     myToolbar.setTitle(""); 
     setSupportActionBar(myToolbar); 
     drawerToggle = new EndDrawerToggle(this, 
       mDrawerLayout, 
       myToolbar, 
       R.string.drawer_open, 
       R.string.drawer_close); 
     mDrawerLayout.addDrawerListener(drawerToggle);  
     //.... 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.settings) { 
      //do smth 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 

EndDrawerToggle 클래스는 this answer에서입니다.

답변

0

Toolbar의 메뉴는 항상 Toolbar의 동작을 수정하는 것 외에는 별다른 의미가 없는데, 그다지 간단하지는 않습니다.

하나의 옵션은 설정을 위해 Toolbar에 자신의 Button을 추가하는 것입니다. 그래도 EndDrawerToggleButton이 동적으로 생성되어 추가되기 때문에 약간 다루기가 힘들 수 있습니다. 따라서 최종적으로 쌓기를 원하는 다른 모든 View은 비슷하게 생성되고 추가되어야합니다. 토글이 설정되었습니다.

그러나 일부 수정을 통해 EndDrawerToggle에 메뉴와 직접 통합하여 끝에 추가하는 항상 표시되는 메뉴 항목의 아이콘으로 토글 드로어 블을 설정할 수 있습니다. Toolbar에 직접 토글을 추가 할 때와 마찬가지로 드로어 블에 ImageButton을 제공 할 필요가 없으므로 실제로는 더 간단한 클래스가됩니다.

import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.graphics.drawable.DrawerArrowDrawable; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 


public class EndMenuDrawerToggle implements DrawerLayout.DrawerListener { 

    private final DrawerLayout drawerLayout; 
    private final Toolbar toolbar; 
    private final DrawerArrowDrawable arrowDrawable; 
    private final int openDrawerContentDesc, closeDrawerContentDesc; 
    private MenuItem toggleItem; 

    public EndMenuDrawerToggle(DrawerLayout drawerLayout, Toolbar toolbar, 
           int openDrawerContentDesc, int closeDrawerContentDesc) { 
     this.drawerLayout = drawerLayout; 
     this.toolbar = toolbar; 

     this.openDrawerContentDesc = openDrawerContentDesc; 
     this.closeDrawerContentDesc = closeDrawerContentDesc; 

     arrowDrawable = new DrawerArrowDrawable(toolbar.getContext()); 
     arrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_END); 
    } 

    public void setToggleOnMenu(Menu menu) { 
     toggleItem = menu.add(openDrawerContentDesc); 
     toggleItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
     toggleItem.setIcon(arrowDrawable); 
     toggleItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 
        toggle(); 
        return true; 
       } 
      } 
     ); 

     setPosition(drawerLayout.isDrawerOpen(GravityCompat.END) ? 1f : 0f); 
    } 

    private void toggle() { 
     final int drawerLockMode = drawerLayout.getDrawerLockMode(GravityCompat.END); 
     if (drawerLayout.isDrawerVisible(GravityCompat.END) 
      && (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) { 
      drawerLayout.closeDrawer(GravityCompat.END); 
     } 
     else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) { 
      drawerLayout.openDrawer(GravityCompat.END); 
     } 
    } 

    private void setPosition(float position) { 
     if (position == 1f) { 
      arrowDrawable.setVerticalMirror(true); 
      toggleItem.setTitle(closeDrawerContentDesc); 
     } 
     else if (position == 0f) { 
      arrowDrawable.setVerticalMirror(false); 
      toggleItem.setTitle(openDrawerContentDesc); 
     } 
     arrowDrawable.setProgress(position); 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     setPosition(Math.min(1f, Math.max(0f, slideOffset))); 
    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     setPosition(1f); 
    } 

    @Override 
    public void onDrawerClosed(View drawerView) { 
     setPosition(0f); 
    } 

    @Override 
    public void onDrawerStateChanged(int newState) {} 
} 

초기화는 기본적으로 동일합니다. 평소에 인스턴스를 생성하고 DrawerLayoutDrawerListener으로 추가하십시오.

drawerToggle = new EndMenuDrawerToggle(mDrawerLayout, 
             myToolbar, 
             R.string.open_drawer_end, 
             R.string.close_drawer_end); 
mDrawerLayout.addDrawerListener(drawerToggle); 
... 

의 차이는 우리가 토글의 setToggleOnMenu() 방법이 팽창 메뉴를 통과 onCreateOptionsMenu() 방법에 온다. 드로어 블이 올바르게 위의 방법으로 동기화됩니다로

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 

    drawerToggle.setToggleOnMenu(menu); 

    return true; 
} 

우리는이 클래스와 syncState()를 호출하지 않습니다.


screenshot

이 예제는 단순히 기존의 MenuMenuItem을 추가하고, SHOW_AS_ACTION_ALWAYS로 해당 항목을 설정 있습니다 마십시오. 주어진 메뉴에서 원하는대로 작동하지만 오버플로 항목이있는 메뉴와 함께 사용하면 3 점 오버 플로우 아이콘이 토글을 지나서 표시됩니다.

그래도 맨 마지막에 토글이 있으면 오버 플로우를 "수동으로"처리해야합니다. 예를 들어, 3 도트 아이콘에 대한 사용자 정의 항목을 추가하고 팝업 메뉴에서 별도의 메뉴를 열면됩니다.