2017-11-04 12 views
0

私のToolbarには、1つの項目「設定」と、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の動作を何らかの形で直接変更することを除けばそれほど多くはありません。

1つのオプションは、メニューを完全に捨てて、Toolbarに独自のButtonを追加することです。しかし、EndDrawerToggleButtonが動的に作成され追加されるため、最後にスタックする前にスタックしたいと思うその他のものは、作成して同様に追加するか、トグルが設定されています。

しかし、いくつかの変更を加えれば、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ドットアイコンのカスタム項目を追加し、ポップアップで別のメニューを開くことによって、

関連する問題