MainActivity.java

package com.qiufeng.astest;import android.app.Activity;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.content.Context;import android.os.Build;import android.os.Bundle;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.TextView;public class MainActivity extends ActionBarActivity        implements NavigationDrawerFragment.NavigationDrawerCallbacks {    /**     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.     * 用于显示侧栏的fragment     */    private NavigationDrawerFragment mNavigationDrawerFragment;    /**     * Used to store the last screen title. For use in {@link #restoreActionBar()}.     * 在标题上显示上一次选中的item中的文字内容     */    private CharSequence mTitle;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mNavigationDrawerFragment = (NavigationDrawerFragment)                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);        mTitle = getTitle();        //初始化drawer        mNavigationDrawerFragment.setUp(                R.id.navigation_drawer,                (DrawerLayout) findViewById(R.id.drawer_layout));    }    //实现NavigationDrawerFragment中的接口    @Override    public void onNavigationDrawerItemSelected(int position) {        // update the main content by replacing fragments        // 更新content中显示的内容        FragmentManager fragmentManager = getSupportFragmentManager();        fragmentManager.beginTransaction()                .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))                .commit();    }    public void onSectionAttached(int number) {        switch (number) {            case 1:                mTitle = getString(R.string.title_section1);                break;            case 2:                mTitle = getString(R.string.title_section2);                break;            case 3:                mTitle = getString(R.string.title_section3);                break;        }    }    public void restoreActionBar() {        ActionBar actionBar = getSupportActionBar();        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);        actionBar.setDisplayShowTitleEnabled(true);        actionBar.setTitle(mTitle);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        if (!mNavigationDrawerFragment.isDrawerOpen()) {            // Only show items in the action bar relevant to this screen            // if the drawer is not showing. Otherwise, let the drawer            // decide what to show in the action bar.            getMenuInflater().inflate(R.menu.main, menu);            restoreActionBar();            return true;        }        return super.onCreateOptionsMenu(menu);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }    /**     * A placeholder fragment containing a simple view.     * 侧栏选中item之后显示的内容fragment     */    public static class PlaceholderFragment extends Fragment {        /**         * The fragment argument representing the section number for this         * fragment.         */        private static final String ARG_SECTION_NUMBER = "section_number";        /**         * Returns a new instance of this fragment for the given section         * number.         */        public static PlaceholderFragment newInstance(int sectionNumber) {            PlaceholderFragment fragment = new PlaceholderFragment();            Bundle args = new Bundle();            args.putInt(ARG_SECTION_NUMBER, sectionNumber);            fragment.setArguments(args);            return fragment;        }        public PlaceholderFragment() {        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                                 Bundle savedInstanceState) {            View rootView = inflater.inflate(R.layout.fragment_main, container, false);            return rootView;        }        @Override        public void onAttach(Activity activity) {            super.onAttach(activity);            ((MainActivity) activity).onSectionAttached(                    getArguments().getInt(ARG_SECTION_NUMBER));        }    }}


抽屉(Drawer)的布局文件

package com.qiufeng.astest;import android.support.v7.app.ActionBarActivity;import android.app.Activity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.support.v4.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.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  * design guidelines for a complete explanation of the behaviors implemented here. */public class NavigationDrawerFragment extends Fragment {    /**     * Remember the position of the selected item.     * 选中item的位置     */    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";    /**     * Per the design guidelines, you should show the drawer on launch until the user manually     * expands it. This shared preference tracks this.     */    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";    /**     * 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;    private boolean mFromSavedInstanceState;    private boolean mUserLearnedDrawer;    public NavigationDrawerFragment() {    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Read in the flag indicating whether or not the user has demonstrated awareness of the        // drawer. See PREF_USER_LEARNED_DRAWER for details.        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());        //默认值为false        mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);        if (savedInstanceState != null) {            mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);            mFromSavedInstanceState = true;        }        // Select either the default item (0) or the last selected item.        // 默认位置为第一个,或者是显示上一次打开的位置        selectItem(mCurrentSelectedPosition);    }    @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);    }    @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(                getActionBar().getThemedContext(),                android.R.layout.simple_list_item_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);    }    /**     * 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) {        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(                getActivity(),                    /* host Activity */                mDrawerLayout,                    /* DrawerLayout object */                R.drawable.ic_drawer,             /* 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().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()            }            @Override            public void onDrawerOpened(View drawerView) {                super.onDrawerOpened(drawerView);                if (!isAdded()) {                    return;                }                //判断用户是否知道drawer的功能                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().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()            }        };        // 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);        //保存STATE_SELECTED_POSITION        outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);    }    /**     * 在Android开发中,如果某些事件触发(例如:旋屏事件),     * 则Activity会重新调用onCreate方法,对Activity重新初始化,     * 这样不仅效率低,而且会造成数据丢失,解决办法是重写onConfigurationChanged方法,     * 并在AndroidManifest.xml中对Activity声明configChanges,     * 这样特定事件触发就会调用onConfigurationChanged方法,     * 而不是onCreate方法重新初始化。     * */    @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 the drawer is open, show the global app actions in the action bar. See also        // showGlobalContextActionBar, which controls the top-left area of the action bar.        if (mDrawerLayout != null && isDrawerOpen()) {            inflater.inflate(R.menu.global, menu);            showGlobalContextActionBar();        }        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 ((ActionBarActivity) getActivity()).getSupportActionBar();    }    /**     * Callbacks interface用到这个fragment时都必须实现这个接口     */    public static interface NavigationDrawerCallbacks {        /**         * Called when an item in the navigation drawer is selected.         */        void onNavigationDrawerItemSelected(int position);    }}

布局文件:

activity_main.xml

                    


fragment_main.xml

    

fragment_navigation_drawer.xml



更多相关文章

  1. 纯Java代码写登录注册页面
  2. Android(安卓)DES AES MD5加密
  3. Android自定义dialog向Activity传递数据
  4. android pageview 类 滑动跟随
  5. 使用View绘制虚线时demo,方便复习
  6. 自定义Android(安卓)ORM 框架greenDAO数据库文件的路径
  7. Android(安卓)EditText简单实现右侧点击清除
  8. RXjava+Retrofit二级购物车
  9. Android中常见的设计模式

随机推荐

  1. react-navigation使用及dva初探二
  2. Android 自定义控件
  3. Android:Gradle 解析
  4. Android -- Android Init进程的处理流程
  5. android process and thread
  6. Blog-07-《一周快速上手Kotlin For Andro
  7. QCom Camera Development
  8. 一个很棒的 Android(安卓)APP框架
  9. android:gravity和android:layout_gravit
  10. 【android内核分析-启动】Android 启动过