我想在Android项目的所有活动中添加导航抽屉。这是MainActivity的代码:
public class MainActivity extends Activity {
private String[] drawerListViewItems;
private DrawerLayout drawerLayout;
private ListView drawerListView;
private ActionBarDrawerToggle actionBarDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get list items from strings.xml
drawerListViewItems = getResources().getStringArray(R.array.items);
// get ListView defined in activity_main.xml
drawerListView = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
drawerListView.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_listview_item, drawerListViewItems));
// App Icon
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
//drawerLayout = (DrawerLayout) findViewById(R.drawable.ic_drawer_2);
actionBarDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
drawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
);
// Set actionBarDrawerToggle as the DrawerListener
drawerLayout.setDrawerListener(actionBarDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
// just styling option add shadow the right edge of the drawer
drawerLayout.setDrawerShadow(R.drawable.ic_drawer, GravityCompat.START);
drawerListView.setOnItemClickListener(new DrawerItemClickListener());
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
actionBarDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
actionBarDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// call ActionBarDrawerToggle.onOptionsItemSelected(), if it returns true
// then it has handled the app icon touch event
if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
displayView(position);
drawerLayout.closeDrawer(drawerListView);
}
private void displayView(int position)
{
switch (position)
{
case 0:
secondactivity();
break;
case 1:
Toast.makeText(MainActivity.this, "2", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(MainActivity.this, "3", Toast.LENGTH_LONG).show();
default:
break;
}
}
}
public void secondactivity (){
Intent cambioActivity;
cambioActivity = new Intent (this, SecondActivity.class);
startActivity(cambioActivity);
}
}
在这段代码中我创建了导航抽屉,我想在所有活动上使用导航抽屉,所以我的第二个活动的代码就是这样:
public class SecondActivity extends MainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_secondactivity);
}
导航抽屉是第一个活动,但没有其他活动,为什么?有人能帮助我吗?
答案 0 :(得分:2)
好吧,伙计们会分享我这样做的方式(如果您正在开发项目之后,并且已经开展了很多活动)。
最后,我用一行代码(在onCreate
中)使导航抽屉充气:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this; //context
//setContentView(R.layout.activity_favorites); // Was so
Utils.inflatedNavigationDrawerView(mContext, R.layout.activity_favorites); // Now is
//...
}
接下来是什么Utils
? :
public class Utils{
public static void inflatedNavigationDrawerView(Context context, int layoutId){
// Here get view of clear DrawerLayout
final View drawerLayout = View.inflate(context,R.layout.navigation_drawer_inflator, null);
// Next inflate to it passed layout for activity
final View mainLayout = View.inflate(context,layoutId, (ViewGroup) drawerLayout);
// And finally inflate to it fragment for NavigationDraver
final View fragmentLayout = View.inflate(context,R.layout.navigation_drawer_inflator_fragment, (ViewGroup) drawerLayout);
// Next we should try to get our drawer (should check with casting to each activity you want to insert to)
NavigationDrawerFragment drawerFragment = null;
// this block should be repeated for each activity you want to use in.
if (context instanceof FavoritesActivity){
// Set our pack of inflates to contentview
((FavoritesActivity) context).setContentView(mainLayout);
// And now we get NavigationDrawerFragment
drawerFragment = (NavigationDrawerFragment)
((FavoritesActivity) context).getSupportFragmentManager().findFragmentById(R.id.navigation_drawer_fragment);
}
if(drawerFragment != null){ // if null then we missed some castings for activity used in.
// Finally setup our drawer
drawerFragment.setUpEasy(R.id.navigation_drawer_fragment, (DrawerLayout)drawerLayout.findViewById(R.id.drawer_layout), (Toolbar) mainLayout.findViewById(R.id.app_bar));
}
}
}
如果你想避免在工具栏中创建汉堡包,那么你应该在setUpEasy的地方:mDrawerToggle.setDrawerIndicatorEnabled(false);
以下是我的设置示例:
public void setUpEasy(int fragmentId, DrawerLayout drawerLayout, Toolbar toolBar) {
mContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolBar, R.string.open, R.string.close){
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if(!mUserLearnedDrawer){
mUserLearnedDrawer = true;
saveToPreferences(getActivity(), Constants.PREFERENCES_LEARNDRAWER_KEY, mUserLearnedDrawer+"");
}
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
}
};
mDrawerToggle.setDrawerIndicatorEnabled(false); // If false then no hamburger menu.
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
}
和使用的观点:
// navigation_drawer_inflator.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dragAndDrop="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.widget.DrawerLayout>
// navigation_drawer_inflator_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<fragment 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/navigation_drawer_fragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout_marginTop="56dp"
app:layout="@layout/fragment_navigation_drawer"
tools:layout="@layout/fragment_navigation_drawer" />
最后,如果您要实现这一点 - 您将能够在运行时将导航抽屉插入任何活动。干杯:)
答案 1 :(得分:1)
简单的方法是你应该创建片段。如果你准备好做一点困难,那么这就适合你。它将允许您在所有活动中使用相同的导航抽屉。
创建drawer_n_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/drawer_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<YourDrawer
android:id="@+id/drawer_drawer"
android:layout_width="match_parent"
android:layout_height="fill_parent" >
</YourDrawer>
</RelativeLayout>
您的DrawerActivity.class
public class DrawerActivity extends Activity {
public RelativeLayout fullLayout;
public FrameLayout frameLayout;
@Override
public void setContentView(int layoutResID) {
fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.drawer_n_activity, null);
frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame);
getLayoutInflater().inflate(layoutResID, frameLayout, true);
super.setContentView(fullLayout);
//Your drawer content...
}
}
现在,要在所有活动中加入相同的导航抽屉并再考虑一下,您的所有活动必须延伸 DrawerActivity
public class MainActivity extends DrawerActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //layout for 1st activity
}
}
public class SecondActivity extends DrawerActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity); //layout for 2nd activity
}
}
答案 2 :(得分:0)
这是我的表现方式。创建帮助程序类。我还添加了一些可选代码来完成()类的完成。
public class NavDrawerHelper extends ContextWrapper{
public NavDrawerHelper(Context context){
super(context);
}
public void initNav(final DrawerLayout drawerLayout, NavigationView navigationView, Toolbar toolbar, final boolean isFinish){
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
switch (id){
case R.id.nav_home:
startActivity(new Intent(getBaseContext(), MainActivity.class));
if (isFinish) ((Activity)getBaseContext()).finish();
drawerLayout.closeDrawers();
break;
case R.id.nav_settings:
startActivity(new Intent(getBaseContext(), SettingsActivity.class));
if (isFinish) ((Activity)getBaseContext()).finish();
drawerLayout.closeDrawers();
break;
}
return true;
}
});
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(((Activity)getBaseContext()),drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){
@Override
public void onDrawerClosed(View v){
super.onDrawerClosed(v);
}
@Override
public void onDrawerOpened(View v) {
super.onDrawerOpened(v);
}
};
drawerLayout.addDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
}
}
然后将此代码添加到所有活动中。这将取代您现有的initNavigationDrawer()方法。
public void initNavigationDrawer() {
//views
NavigationView navigationView = findViewById(R.id.navigation_view);
DrawerLayout drawerLayout = findViewById(R.id.drawer);
NavDrawerHelper navDrawerHelper = new NavDrawerHelper(this);
navDrawerHelper.initNav(drawerLayout, navigationView, toolbar, false);
}