Created
September 11, 2016 04:03
-
-
Save bingluen/0389b2b6093a594e5fde3209ffe6f368 to your computer and use it in GitHub Desktop.
Android: Easiest way to reuse a common Navigation drawer among a group of activities.
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
<?xml version="1.0" encoding="utf-8"?> | |
<android.support.v4.widget.DrawerLayout | |
android:id="@+id/drawer_layout" | |
xmlns:android="http://schemas.android.com/apk/res/android" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
xmlns:app="http://schemas.android.com/apk/res-auto"> | |
<FrameLayout | |
android:id="@+id/view_stub" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent"> | |
</FrameLayout> | |
<android.support.design.widget.NavigationView | |
android:id="@+id/navigation_view" | |
android:layout_width="240dp" | |
android:layout_height="match_parent" | |
android:layout_gravity="start" | |
app:menu="@menu/menu_test" | |
/> | |
</android.support.v4.widget.DrawerLayout> |
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
/* | |
* This is a simple and easy approach to reuse the same | |
* navigation drawer on your other activities. Just create | |
* a base layout that conains a DrawerLayout, the | |
* navigation drawer and a FrameLayout to hold your | |
* content view. All you have to do is to extend your | |
* activities from this class to set that navigation | |
* drawer. Happy hacking :) | |
* P.S: You don't need to declare this Activity in the | |
* AndroidManifest.xml. This is just a base class. | |
*/ | |
import android.content.Intent; | |
import android.content.res.Configuration; | |
import android.os.Bundle; | |
import android.support.design.widget.NavigationView; | |
import android.support.v4.widget.DrawerLayout; | |
import android.support.v7.app.ActionBarDrawerToggle; | |
import android.support.v7.app.AppCompatActivity; | |
import android.view.LayoutInflater; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.FrameLayout; | |
public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener { | |
private FrameLayout view_stub; //This is the framelayout to keep your content view | |
private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy | |
private DrawerLayout mDrawerLayout; | |
private ActionBarDrawerToggle mDrawerToggle; | |
private Menu drawerMenu; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer. | |
view_stub = (FrameLayout) findViewById(R.id.view_stub); | |
navigation_view = (NavigationView) findViewById(R.id.navigation_view); | |
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); | |
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0); | |
mDrawerLayout.setDrawerListener(mDrawerToggle); | |
getSupportActionBar().setDisplayHomeAsUpEnabled(true); | |
drawerMenu = navigation_view.getMenu(); | |
for(int i = 0; i < drawerMenu.size(); i++) { | |
drawerMenu.getItem(i).setOnMenuItemClickListener(this); | |
} | |
// and so on... | |
} | |
@Override | |
protected void onPostCreate(Bundle savedInstanceState) { | |
super.onPostCreate(savedInstanceState); | |
mDrawerToggle.syncState(); | |
} | |
@Override | |
public void onConfigurationChanged(Configuration newConfig) { | |
super.onConfigurationChanged(newConfig); | |
mDrawerToggle.onConfigurationChanged(newConfig); | |
} | |
/* Override all setContentView methods to put the content view to the FrameLayout view_stub | |
* so that, we can make other activity implementations looks like normal activity subclasses. | |
*/ | |
@Override | |
public void setContentView(int layoutResID) { | |
if (view_stub != null) { | |
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); | |
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( | |
ViewGroup.LayoutParams.MATCH_PARENT, | |
ViewGroup.LayoutParams.MATCH_PARENT); | |
View stubView = inflater.inflate(layoutResID, view_stub, false); | |
view_stub.addView(stubView, lp); | |
} | |
} | |
@Override | |
public void setContentView(View view) { | |
if (view_stub != null) { | |
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( | |
ViewGroup.LayoutParams.MATCH_PARENT, | |
ViewGroup.LayoutParams.MATCH_PARENT); | |
view_stub.addView(view, lp); | |
} | |
} | |
@Override | |
public void setContentView(View view, ViewGroup.LayoutParams params) { | |
if (view_stub != null) { | |
view_stub.addView(view, params); | |
} | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
// Pass the event to ActionBarDrawerToggle, if it returns | |
// true, then it has handled the app icon touch event | |
if (mDrawerToggle.onOptionsItemSelected(item)) { | |
return true; | |
} | |
// Handle your other action bar items... | |
return super.onOptionsItemSelected(item); | |
} | |
@Override | |
public boolean onMenuItemClick(MenuItem item) { | |
switch (item.getItemId()) { | |
case R.id.item1: | |
// handle it | |
break; | |
case R.id.item2: | |
// do whatever | |
break; | |
// and so on... | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment