Android 5.0 Naviagation抽屉:当在抽屉中选择物品时,抽屉图标不会变回

问题描述:

我有新的导航抽屉工作为棒棒糖,我看到新的抽屉图标(汉堡包),它切换到< - (左箭头)图标时当抽屉关闭时,抽屉会打开并返回到抽屉图标。到目前为止完美。Android 5.0 Naviagation抽屉:当在抽屉中选择物品时,抽屉图标不会变回

当在抽屉中选择了某些东西时,我用抽屉替换了主要的碎片。我能够看到新的碎片和抽屉关闭,但仍然看到< - 图标,我希望看到抽屉图标(汉堡包),而不是主要碎片被替换时的箭头。我如何控制它?

MainActivity.java

package com.lollipop.navdrawer; 

import android.app.Activity; 

import android.app.ActionBar; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.support.v4.widget.DrawerLayout; 
import android.widget.ArrayAdapter; 
import android.widget.ScrollView; 
import android.widget.TextView; 


public class MyActivity extends ActionBarActivity 
     implements NavigationDrawerFragment.NavigationDrawerCallbacks { 

    private NavigationDrawerFragment mNavigationDrawerFragment; 
    private View container; 
    private CharSequence mTitle; 

    public void setupToolbar(View viewToolbar){ 
     Toolbar toolbar = (Toolbar)viewToolbar; 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      getSupportActionBar().setHomeButtonEnabled(true); 
     } 

    } 

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

     container = findViewById(R.id.container); 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container, new MyFragment()) 
       .commit(); 

     mNavigationDrawerFragment = (NavigationDrawerFragment) 
       getFragmentManager().findFragmentById(R.id.navigation_drawer); 
     mTitle = getTitle(); 

     // Set up the drawer. 
     mNavigationDrawerFragment.setUp(
       R.id.navigation_drawer, 
       (DrawerLayout) findViewById(R.id.drawer_layout)); 

     ScrollView scrollView = (ScrollView)findViewById(R.id.scroll_view); 
    } 

    @Override 
    public void onNavigationDrawerItemSelected(int position) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container, new MyFragment()) 
       .commit(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     if (!mNavigationDrawerFragment.isDrawerOpen()) { 
      getMenuInflater().inflate(R.menu.my, menu); 
      return true; 
     } 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     mNavigationDrawerFragment.mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     mNavigationDrawerFragment.mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onBackPressed() { 
     if(mNavigationDrawerFragment.mDrawerLayout.isDrawerOpen(Gravity.START|Gravity.LEFT)){ 
      mNavigationDrawerFragment.mDrawerLayout.closeDrawers(); 
      return; 
     } 
     super.onBackPressed(); 
    } 
} 

NavigationDrawerFragment.java

package com.lollipop.navdrawer; 


import android.app.Activity; 
import android.app.ActionBar; 
import android.app.Fragment; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.content.SharedPreferences; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

public class NavigationDrawerFragment extends Fragment { 

    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; 

    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; 

    private NavigationDrawerCallbacks mCallbacks; 

    public ActionBarDrawerToggle mDrawerToggle; 

    public DrawerLayout mDrawerLayout; 
    private ListView mDrawerListView; 
    private View mFragmentContainerView; 

    private int mCurrentSelectedPosition = 0; 
    private boolean mFromSavedInstanceState; 
    private boolean mUserLearnedDrawer; 

    public NavigationDrawerFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); 

     if (savedInstanceState != null) { 
      mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); 
      mFromSavedInstanceState = true; 
     } 

     selectItem(mCurrentSelectedPosition); 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     mDrawerListView = (ListView) inflater.inflate(
       R.layout.fragment_navigation_drawer, container, false); 
     mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       selectItem(position); 
      } 
     }); 
     mDrawerListView.setAdapter(new ArrayAdapter<String>(
       getActivity(), 
       android.R.layout.simple_list_item_activated_1, 
       android.R.id.text1, 
       new String[]{ 
         getString(R.string.title_section1), 
         getString(R.string.title_section2), 
         getString(R.string.title_section3), 
       })); 

     mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); 
     return mDrawerListView; 
    } 

    public boolean isDrawerOpen() { 
     return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView); 
    } 

    public void setUp(int fragmentId, DrawerLayout drawerLayout) { 
     mFragmentContainerView = getActivity().findViewById(fragmentId); 
     mDrawerLayout = drawerLayout; 

     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

     Toolbar mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 

     mDrawerToggle = new ActionBarDrawerToggle(
       getActivity(),     /* host Activity */ 
       mDrawerLayout,     /* DrawerLayout object */ 
       mToolbar,    /* nav drawer image to replace 'Up' caret */ 
       R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ 
       R.string.navigation_drawer_close /* "close drawer" description for accessibility */ 
     ) { 
      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
       if (!isAdded()) { 
        return; 
       } 

       getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if (!isAdded()) { 
        return; 
       } 

       if (!mUserLearnedDrawer) { 
        // The user manually opened the drawer; store this flag to prevent auto-showing 
        // the navigation drawer automatically in the future. 
        mUserLearnedDrawer = true; 
        SharedPreferences sp = PreferenceManager 
          .getDefaultSharedPreferences(getActivity()); 
        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); 
       } 

       getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
      } 
     }; 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, 
     // per the navigation drawer design guidelines. 
     if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
      mDrawerLayout.openDrawer(mFragmentContainerView); 
     } 

     // Defer code dependent on restoration of previous instance state. 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 
    } 

    private void selectItem(int position) { 
     mCurrentSelectedPosition = position; 
     if (mDrawerListView != null) { 
      mDrawerListView.setItemChecked(position, true); 
     } 
     if (mDrawerLayout != null) { 
      mDrawerLayout.closeDrawer(mFragmentContainerView); 
     } 
     if (mCallbacks != null) { 
      mCallbacks.onNavigationDrawerItemSelected(position); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mCallbacks = (NavigationDrawerCallbacks) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException("Activity must implement NavigationDrawerCallbacks."); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mCallbacks = null; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Forward the new configuration the drawer toggle component. 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     if (mDrawerLayout != null && isDrawerOpen()) { 
      inflater.inflate(R.menu.global, menu); 
     } 
     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 

     if (item.getItemId() == R.id.action_example) { 
      Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * Per the navigation drawer design guidelines, updates the action bar to show the global app 
    * 'context', rather than just what's in the current screen. 
    */ 
    private void showGlobalContextActionBar() { 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     actionBar.setTitle(R.string.app_name); 
    } 

    private ActionBar getActionBar() { 
     return getActivity().getActionBar(); 
    } 

    /** 
    * Callbacks interface that all activities using this fragment must implement. 
    */ 
    public static interface NavigationDrawerCallbacks { 
     /** 
     * Called when an item in the navigation drawer is selected. 
     */ 
     void onNavigationDrawerItemSelected(int position); 
    } 
} 

MyFragment.java

package com.lollipop.navdrawer; 

import android.app.Activity; 
import android.app.Dialog; 
import android.app.Fragment; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

import java.util.Arrays; 
import java.util.List; 


public class MyFragment extends Fragment { 
    private MyActivity mActivity; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_my, container, false); 
     mActivity = (MyActivity)getActivity(); 
     mActivity.setupToolbar(view.findViewById(R.id.toolbar)); 
     return view; 
    } 
} 
+0

u能PLZ把我们的代码 – 2014-11-04 16:03:02

+0

我们将需要更多的代码,所以我们可以提供帮助。你也可以查看这个模板的一些提示:https://github.com/kanytu/android-material-drawer-template – 2014-11-04 16:19:23

+0

@HirakChhatbar,代码连接 – nomongo 2014-11-05 01:37:01

您必须致电ActionBarDrawerToggle.syncState()您的setupToolbar功能。既然你没有访问mDrawerToggle你的活动,你将不得不创建您的片段的getter和称呼它mNavigationDrawerFragment.getDrawerToggle().syncState();