Android:所有活动的导航抽屉

时间:2015-02-23 16:15:42

标签: java android android-activity navigation-drawer

我想在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);

    }

导航抽屉是第一个活动,但没有其他活动,为什么?有人能帮助我吗?

3 个答案:

答案 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);

}