Instantly share code, notes, and snippets.
Created
May 12, 2015 01:20
-
Save eneim/3d6cfd55a321ac473895 to your computer and use it in GitHub Desktop.
NavigationDrawerFragment without glitch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package im.ene.lab.resume.fragments; | |
import im.ene.lab.resume.R; | |
import android.app.Activity; | |
import android.content.res.Configuration; | |
import android.os.Bundle; | |
import android.os.Handler; | |
import android.support.v4.app.Fragment; | |
import android.support.v4.widget.DrawerLayout; | |
import android.support.v7.app.ActionBar; | |
import android.support.v7.app.ActionBarActivity; | |
import android.support.v7.app.ActionBarDrawerToggle; | |
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; | |
/** | |
* Fragment used for managing interactions for and presentation of a navigation | |
* drawer. See the <a href= | |
* "https://developer.android.com/design/patterns/navigation-drawer.html#Interaction" | |
* > design guidelines</a> for a complete explanation of the behaviors | |
* implemented here. | |
*/ | |
public class NavigationDrawerFragment extends Fragment { | |
/** | |
* Remember the position of the selected item. | |
*/ | |
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; | |
/** | |
* A pointer to the current callbacks instance (the Activity). | |
*/ | |
private NavigationDrawerCallbacks mCallbacks; | |
/** | |
* Helper component that ties the action bar to the navigation drawer. | |
*/ | |
private ActionBarDrawerToggle mDrawerToggle; | |
private DrawerLayout mDrawerLayout; | |
private ListView mDrawerListView; | |
private View mFragmentContainerView; | |
private int mCurrentSelectedPosition = 0; | |
public NavigationDrawerFragment() { | |
} | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
mActivity = getActivity(); | |
// this handler is used to smoothly close the navigation fragment | |
mHandler = new Handler(); | |
} | |
@Override | |
public void onActivityCreated(Bundle savedInstanceState) { | |
super.onActivityCreated(savedInstanceState); | |
// Indicate that this fragment would like to influence the set of | |
// actions in the action bar. | |
setHasOptionsMenu(true); | |
// Select either the default item (1) or the last selected item. | |
selectItem(mCurrentSelectedPosition); | |
} | |
private Activity mActivity; | |
private Handler mHandler; | |
@Override | |
public View onCreateView(LayoutInflater inflater, ViewGroup container, | |
Bundle savedInstanceState) { | |
View rootView = inflater.inflate(R.layout.fragment_navigation_drawer, | |
container, false); | |
mDrawerListView = (ListView) rootView.findViewById(R.id.listview); | |
mDrawerListView.setAdapter(new ArrayAdapter<String>(getActivity(), | |
R.layout.item_drawertext, getActivity().getResources() | |
.getStringArray(R.array.navigation_title)) { | |
}); | |
mDrawerListView | |
.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |
@Override | |
public void onItemClick(AdapterView<?> parent, View view, | |
final int position, long id) { | |
mCurrentSelectedPosition = position; | |
mPendingRunnable = new Runnable() { | |
@Override | |
public void run() { | |
if (mCallbacks != null) { | |
mCallbacks | |
.onNavigationDrawerItemSelected(position); | |
} | |
} | |
}; | |
if (mDrawerListView != null) { | |
mDrawerListView.setItemChecked(position, true); | |
} | |
if (mDrawerLayout != null) { | |
mDrawerLayout.closeDrawer(mFragmentContainerView); | |
} | |
} | |
}); | |
// this.mDrawerListView | |
// .setItemChecked(this.mCurrentSelectedPosition, true); | |
return rootView; | |
} | |
@Override | |
public void onResume() { | |
super.onResume(); | |
} | |
public boolean isDrawerOpen() { | |
return mDrawerLayout != null | |
&& mDrawerLayout.isDrawerOpen(mFragmentContainerView); | |
} | |
/** | |
* Users of this fragment must call this method to set up the navigation | |
* drawer interactions. | |
* | |
* @param fragmentId | |
* The android:id of this fragment in its activity's layout. | |
* @param drawerLayout | |
* The DrawerLayout containing this fragment's UI. | |
*/ | |
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) { | |
mFragmentContainerView = getActivity().findViewById(fragmentId); | |
mDrawerLayout = drawerLayout; | |
// set a custom shadow that overlays the main content when the drawer | |
// opens | |
// mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, | |
// GravityCompat.START); | |
// set up the drawer's list view with items and click listener | |
ActionBar actionBar = getActionBar(); | |
actionBar.setDisplayHomeAsUpEnabled(true); | |
actionBar.setHomeButtonEnabled(true); | |
// ActionBarDrawerToggle ties together the the proper interactions | |
// between the navigation drawer and the action bar app icon. | |
mDrawerToggle = new ActionBarDrawerToggle(mActivity, /* host Activity */ | |
mDrawerLayout, /* DrawerLayout object */ | |
toolbar, /* nav drawer image to replace 'Up' caret */ | |
R.string.open, R.string.close) { | |
@Override | |
public void onDrawerClosed(View drawerView) { | |
super.onDrawerClosed(drawerView); | |
if (!isAdded()) { | |
return; | |
} | |
getActivity().supportInvalidateOptionsMenu(); // calls | |
// onPrepareOptionsMenu() | |
// If mPendingRunnable is not null, then add to the message | |
// queue | |
if (mPendingRunnable != null) { | |
mHandler.post(mPendingRunnable); | |
mPendingRunnable = null; | |
} | |
} | |
@Override | |
public void onDrawerOpened(View drawerView) { | |
super.onDrawerOpened(drawerView); | |
if (!isAdded()) { | |
return; | |
} | |
getActivity().supportInvalidateOptionsMenu(); // calls | |
// onPrepareOptionsMenu() | |
} | |
@Override | |
public void onDrawerSlide(View drawerView, float slideOffset) { | |
super.onDrawerSlide(drawerView, slideOffset); | |
if (mCallbacks != null) | |
mCallbacks.onNavigationPanelSliding(slideOffset); | |
} | |
}; | |
// Defer code dependent on restoration of previous instance state. | |
mDrawerLayout.post(new Runnable() { | |
@Override | |
public void run() { | |
mDrawerToggle.syncState(); | |
} | |
}); | |
mDrawerLayout.setDrawerListener(mDrawerToggle); | |
} | |
private Runnable mPendingRunnable; | |
private void selectItem(final int position) { | |
mCurrentSelectedPosition = position; | |
if (mCallbacks != null) { | |
mCallbacks.onNavigationDrawerItemSelected(position); | |
} | |
if (mDrawerListView != null) { | |
mDrawerListView.setItemChecked(position, true); | |
} | |
if (mDrawerLayout != null) { | |
mDrawerLayout.closeDrawer(mFragmentContainerView); | |
} | |
} | |
@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); | |
mDrawerToggle.onConfigurationChanged(newConfig); | |
} | |
@Override | |
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | |
// If the drawer is open, show the global app actions in the action bar. | |
if (isDrawerOpen()) { | |
inflater.inflate(R.menu.global, menu); | |
if (mCallbacks != null) | |
mCallbacks.onNavigationPanelOpened(); | |
return; | |
} | |
super.onCreateOptionsMenu(menu, inflater); | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) { | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
private ActionBar getActionBar() { | |
return ((ActionBarActivity) getActivity()).getSupportActionBar(); | |
} | |
/** | |
* 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); | |
void onNavigationPanelOpened(); | |
void onNavigationPanelSliding(float slideOffset); | |
} | |
public void closeDrawer() { | |
mDrawerLayout.closeDrawer(mFragmentContainerView); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment