Android-NavigationView from right to left

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

I'm using The last version of Android Studio (1.5) and I want to make a menu using Drawer Layout, for position its call GravityCompat.

I'm trying to use this components and modify it, putting the Drawer out from right to left. Here is my code.

public class MainActivity extends AppCompatActivity     implements NavigationView.OnNavigationItemSelectedListener {  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);     setSupportActionBar(toolbar);      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(             this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);     drawer.setDrawerListener(toggle);     toggle.syncState();      NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);     navigationView.setNavigationItemSelectedListener(this); }  @Override public void onBackPressed() {     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);     if (drawer.isDrawerOpen(GravityCompat.END)) {         drawer.closeDrawer(GravityCompat.END);     } else {         super.onBackPressed();     } }  @Override public boolean onCreateOptionsMenu(Menu menu) {     // Inflate the menu; this adds items to the action bar if it is present.     getMenuInflater().inflate(R.menu.main, menu);     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     if (id == R.id.action_settings) {         return true;     }      return super.onOptionsItemSelected(item); }  @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) {     // Handle navigation view item clicks here.     int id = item.getItemId();      if (id == R.id.nav_camera) {         // Handle the camera action     } else if (id == R.id.nav_gallery) {      } else if (id == R.id.nav_slideshow) {      } else if (id == R.id.nav_manage) {      }      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);     drawer.closeDrawer(GravityCompat.END);     return true; } } 

The XML

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout    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" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start">  <include     layout="@layout/app_bar_main"     android:layout_width="match_parent"     android:layout_height="match_parent" />  <android.support.design.widget.NavigationView     android:id="@+id/nav_view"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_gravity="end"     android:fitsSystemWindows="true"     app:menu="@menu/activity_main_drawer" />  </android.support.v4.widget.DrawerLayout> 

As you can see, GravityCompat don't let me to put right instead of END or START, and if I put it in the XML, it crash.

with the next error:

java.lang.IllegalArgumentException: No drawer view found with gravity LEFT 

回答1:

First of all replace on DrawerLayout the tools:openDrawer="start" with tools:openDrawer="end". Now your problem is on the toggle, which opens the left drawer, and because you have only right drawer it throws the exception. You can add your own button on the actionbar (on the right side) to open the drawer. To do that change your app_bar.xml like this

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true">      <android.support.design.widget.AppBarLayout         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:theme="@style/AppTheme.AppBarOverlay">          <RelativeLayout             android:layout_width="match_parent"             android:layout_height="wrap_content">              <android.support.v7.widget.Toolbar                 android:id="@+id/toolbar"                 android:layout_width="match_parent"                 android:layout_height="?attr/actionBarSize"                 android:background="?attr/colorPrimary"                 app:popupTheme="@style/AppTheme.PopupOverlay" />                  <FrameLayout                     android:id="@+id/drawer_button"                     android:layout_width="50dp"                     android:layout_height="?attr/actionBarSize"                     android:layout_alignParentRight="true"                     android:clickable="true">                      <ImageView                         android:layout_width="wrap_content"                         android:layout_height="wrap_content"                         android:layout_gravity="center_horizontal|center_vertical"                         android:src="@mipmap/ic_drawer" />                 </FrameLayout>           </RelativeLayout>       </android.support.design.widget.AppBarLayout>      <include layout="@layout/content_main" />  </android.support.design.widget.CoordinatorLayout> 

Then change your onCreate method from your Activity like this

@Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);     setSupportActionBar(toolbar);      findViewById(R.id.drawer_button).setOnClickListener(new View.OnClickListener() {         @Override         public void onClick(View v) {             // open right drawer             DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);             drawer.openDrawer(GravityCompat.END);         }     });      NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);     navigationView.setNavigationItemSelectedListener(this); } 

Also you can find the image for your drawer here or here. I hope this will help you. :)



回答2:

use a custom drawerLayout just like this :

public class TaskManagerDrawerLayout  extends DrawerLayout {  public TaskManagerDrawerLayout(Context context) {     super(context); }  public TaskManagerDrawerLayout(Context context, AttributeSet attrs) {     super(context, attrs); }  public TaskManagerDrawerLayout(Context context, AttributeSet attrs, int defStyle) {     super(context, attrs, defStyle); }  @Override public boolean onInterceptTouchEvent(MotionEvent ev) {     try {         return super.onInterceptTouchEvent(ev);     } catch (IllegalArgumentException e) {         e.printStackTrace();         return false;     } }  @Override public void closeDrawer(int gravity) {     super.closeDrawer(GravityCompat.END); }  @Override public void openDrawer(int gravity) {     super.openDrawer(GravityCompat.END); }  } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!