2016-01-19 2 views
1

Я пытаюсь сделать слайды DrawerLayout справа налево.Android - Без выдвижного ящика Просмотр с гравитацией LEFT

Я следил за this tutorial и нашел, что это очень удовлетворительно и ясно для DrawerLayout, который скользит слева направо.

Когда я изменяю gravity из android.support.design.widget.NavigationView в right, он скользит справа налево, но, кнопка гамбургер не работает должным образом больше, это показывает No drawer view found with gravity LEFT, когда я попытался прикасаясь к нему.

Вот модифицированная функция переключения

// Initializing Drawer Layout and ActionBarToggle 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer); 
     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.openDrawer, R.string.closeDrawer){ 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank 
       super.onDrawerClosed(drawerView); 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank 

       super.onDrawerOpened(drawerView); 
      } 
//Added the lines below, tried solutions online but fail.. 
      @Override 
      public boolean onOptionsItemSelected(MenuItem item) { 
       if (item != null && item.getItemId() == android.R.id.home) { 
        if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { 
         drawerLayout.closeDrawer(Gravity.RIGHT); 
        } else { 
         drawerLayout.openDrawer(Gravity.RIGHT); 
        } 
       } 
       return false; 
      } 

     }; 

Так .. Как сделать кнопку гамбургер работу снова?

UPDATE

Вот XML-файл основного макета

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".Activities.NewsfeedActivity"> 

    <LinearLayout 
     android:id="@+id/activity_newsfeed_wrapper" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:orientation="vertical" > 

     <android.support.v7.widget.Toolbar 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/activity_newsfeed_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/abc_action_bar_default_height_material" 
      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

     <FrameLayout 
      android:id="@+id/activity_newsfeed_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

     </FrameLayout> 

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/activity_newsfeed_navigationView" 
     android:layout_height="match_parent" 
     android:layout_width="wrap_content" 
     android:layout_gravity="right" 
     app:headerLayout="@layout/drawer_header" 
     app:menu="@menu/drawer" /> 
</android.support.v4.widget.DrawerLayout> 

Вот мой основной класс

public class NewsfeedActivity extends AppCompatActivity { 

    //Defining Variables 
    private Toolbar toolbar; 
    private NavigationView navigationView; 
    private DrawerLayout drawerLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_newsfeed); 

     // Initializing Toolbar and setting it as the actionbar 
     toolbar = (Toolbar) findViewById(R.id.activity_newsfeed_toolbar); 
     setSupportActionBar(toolbar); 

     //Initializing NavigationView 
     navigationView = (NavigationView) findViewById(R.id.activity_newsfeed_navigationView); 

     //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

      // This method will trigger on item Click of navigation menu 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 


       //Checking if the item is in checked state or not, if not make it in checked state 
       if(menuItem.isChecked()) menuItem.setChecked(false); 
       else menuItem.setChecked(true); 

       //Closing drawer on item click 
       drawerLayout.closeDrawers(); 

       //Check to see which item was being clicked and perform appropriate action 
       switch (menuItem.getItemId()){ 


        //Replacing the main content with ContentFragment Which is our Inbox View; 
        case R.id.a: 
         Toast.makeText(getApplicationContext(), "Inbox Selected", Toast.LENGTH_SHORT).show(); 
         ContentFragment fragment = new ContentFragment(); 
         android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
         fragmentTransaction.replace(R.id.activity_newsfeed_frame,fragment); 
         fragmentTransaction.commit(); 
         return true; 

        // For rest of the options we just show a toast on click 

        case R.id.b: 
         Toast.makeText(getApplicationContext(),"b Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.c: 
         Toast.makeText(getApplicationContext(),"c Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.d: 
         Toast.makeText(getApplicationContext(),"d Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.e: 
         Toast.makeText(getApplicationContext(),"e Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.f: 
         Toast.makeText(getApplicationContext(),"f Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.g: 
         Toast.makeText(getApplicationContext(),"g Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.h: 
         Toast.makeText(getApplicationContext(),"h Selected",Toast.LENGTH_SHORT).show(); 
         return true; 
        default: 
         Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show(); 
         return true; 

       } 
      } 
     }); 

     // Initializing Drawer Layout and ActionBarToggle 
     drawerLayout = (DrawerLayout) findViewById(R.id.drawer); 
     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.openDrawer, R.string.closeDrawer){ 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank 
       super.onDrawerClosed(drawerView); 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank 

       super.onDrawerOpened(drawerView); 
      } 

     }; 

     //Setting the actionbarToggle to drawer layout 
     drawerLayout.setDrawerListener(actionBarDrawerToggle); 

     //calling sync state is necessay or else your hamburger icon wont show up 
     actionBarDrawerToggle.syncState(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.drawer, 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. 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { 
        drawerLayout.closeDrawer(Gravity.RIGHT); 
       } else { 
        drawerLayout.openDrawer(Gravity.RIGHT); 
       } 
       return true; 
      case R.id.action_settings: 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

Update 02/02/2016

попытался изменить вид ящика на RIGHT .. Но это плохая идея, потому что ничего не меняется. Пробовал перемещение NavigationView в LinearLayout, это еще хуже, потому что не будет никакого скольжения меню ..

попытался изменить вещи в onOptionsItemSelected

case android.R.id.home: 
       if (drawerLayout.isDrawerOpen(GravityCompat.END)) { 
        drawerLayout.closeDrawer(GravityCompat.END); 
       } else { 
        drawerLayout.openDrawer(GravityCompat.END); 
       } 

Изменено Gravity.RIGHT к GravityCompat.END, «NOPE», код говорит ..

+0

показать мне уры навигационного вида –

+0

Там, он находится в самом низу макета .. –

+0

ок W8 им chking –

ответ

0

попробовать это в навигационном View

андроида: layout_gravity = "конец" вместо андроида: layout_gravity = "право"

<android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_height="match_parent" 
     android:layout_width="wrap_content" 
     android:layout_gravity="end" 
     app:headerLayout="@layout/header" 
     app:menu="@menu/drawer" 
     /> 

// Добавьте эти строки в файле активности Java, он будет работает

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 
      case android.R.id.home: 
       if (mDrawer.isDrawerOpen(Gravity.RIGHT)) { 
        mDrawer.closeDrawer(Gravity.RIGHT); 
       } else { 
        mDrawer.openDrawer(Gravity.RIGHT); 
       } 
       return true; 
      case R.id.action_settings: 
       return true; 
     } 
final update: 

я изменить некоторые строки в образце проекта (MainActivity.java), в настоящее время он работает, используйте этот код.

не забудьте написать android: layout_gravity = "end" вместо android: layout_gravity = "start" в вашем XML-файле.

package com.android4dev.navigationview; 


import android.support.design.widget.NavigationView; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 


public class MainActivity extends AppCompatActivity { 

    Toolbar toolbar; 
    NavigationView navigationView; 
    DrawerLayout drawerLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     toolbar=(Toolbar)findViewById(R.id.toolbar); 
     navigationView=(NavigationView)findViewById(R.id.navigation_view); 
     drawerLayout=(DrawerLayout)findViewById(R.id.drawer); 


     // Set a Toolbar to replace the ActionBar. 
     setToolbarAsActionBar(); 
     // Setup drawer view 
     setupDrawerContent(navigationView); 

     // Set the menu icon instead of the launcher icon. 
     final ActionBar ab = getSupportActionBar(); 
     ab.setHomeAsUpIndicator(R.drawable.ic_menu); 
     ab.setDisplayHomeAsUpEnabled(true); 
     //ab.setDisplayShowTitleEnabled(false); 

     Menu menu = navigationView.getMenu(); 
     MenuItem item = menu.findItem(R.id.starred); 
     selectDrawerItem(item); 

    } 

    private void setToolbarAsActionBar() { 
     setSupportActionBar(toolbar); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 
      case android.R.id.home: 
       if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { 
        drawerLayout.closeDrawer(Gravity.RIGHT); 
       } else { 
        drawerLayout.openDrawer(Gravity.RIGHT); 
       } 
       return true; 
      case R.id.action_settings: 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setupDrawerContent(NavigationView navigationView) { 

     navigationView.setNavigationItemSelectedListener(
       new NavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(MenuItem menuItem) { 

         //Checking if the item is in checked state or not, if not make it in checked state 
         if (menuItem.isChecked()) menuItem.setChecked(false); 
         else menuItem.setChecked(true); 

         selectDrawerItem(menuItem); 
         return true; 
        } 
       }); 
    } 

    public void selectDrawerItem(MenuItem menuItem) { 
     // Create a new fragment and specify the planet to show based on 
     // position 

     switch (menuItem.getItemId()) { 

      case R.id.inbox: 
       Toast.makeText(getApplicationContext(), "Inbox Selected", Toast.LENGTH_SHORT).show(); 
       ContentFragment fragment = new ContentFragment(); 
       android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
       fragmentTransaction.replace(R.id.frame, fragment); 
       fragmentTransaction.commit(); 
       break; 

      case R.id.starred: 
       Toast.makeText(getApplicationContext(), "Stared Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.sent_mail: 
       Toast.makeText(getApplicationContext(), "Send Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.drafts: 
       Toast.makeText(getApplicationContext(), "Drafts Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.allmail: 
       Toast.makeText(getApplicationContext(), "All Mail Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.trash: 
       Toast.makeText(getApplicationContext(), "Trash Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.spam: 
       Toast.makeText(getApplicationContext(), "Spam Selected", Toast.LENGTH_SHORT).show(); 
       break; 

      default: 
       Toast.makeText(getApplicationContext(), "Somethings Wrong", Toast.LENGTH_SHORT).show(); 
       break; 

     } 

     drawerLayout.closeDrawers(); 
    } 

    private ActionBarDrawerToggle setupDrawerToggle() { 
     return new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer); 
    } 

} 
+0

Там, я я изменил основную деятельность таким образом .. Я уже последовали за вашим 'onOptionsItemSelected' в самом низу, но он все еще не работает. Все еще спрашивая' DrawerView' с гравитацией 'LEFT' –

+0

вы писали андроид: layout_gravity = «end» в вашем навигационном представлении. –

+0

Да, я попробовал «ПРАВИЛЬНО», но безрезультатно, к сожалению .. –

Смежные вопросы