Android 的SDK其实为我们提供了很好的“SlidingMenu”示例,即所谓“抽屉”框架,我们简单分析一下实现的代码。
首先看下代码结构:
包括java代码文件
——|-MainActivity.java //示例的载体
|-NavigationDrawerFragment.java //"SlidingMenu"的fragment类
和布局文件
——|-activity_main.xml // 采用android.support.v4.widget.DrawerLayout布局,布局中包括一个FrameLayout和fragment组件,其中 // fragment即承载SlidingMenu的组件
|-fragment_main.xml //“界面”布局文件,这里放了一个Textview,其实可以放任何元素
|-fragment_navigation_drawer.xml //“SlidingMenu”布局文件,这里仅仅是一个ListView布局控件
首先看下activity_main.xml文件,采用android support v4库中的抽屉布局类DrawerLayout(封装了手势滑动的响应处理,只要滑动),并包含一个显示FrameLayout,用来显示“应用内容”的“界面”载体:
1
2
3
4
5
6
7
8<!-- As the main content view, the view below consumes the entire space available using match_parent in both dimensions. --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" />
1
2
3
4
5
6
7
8
9
10<!-- The drawer is given a fixed width in dp and extends the full height of the container. --> <fragment android:id="@+id/navigation_drawer" android:name="com.example.scsc.NavigationDrawerFragment" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" />
当程序启动时,MainActivity.java->onCreate()方法时,首先加载了R.layout.activity_main布局,再通过FragmentManager加载"抽屉"的fragment,并调用NavigationDrawerFragment.setUp()方法(设置)初始化抽屉布局的使用环境,包括抽屉布局的背景、ActionBar、抽屉监听类mDrawerToggle。
1、mDrawerToggle实现了对抽屉打开事件onDrawerOpened和关闭事件onDrawerClosed的监听,同时实现了打开状态和关闭状态的标志图片的显示。
2、通过对ActionBar的设置,可以实现HomeButton的图片的显示和toggle开关功能的开关:
1
2
3ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);//是否显示Toggle开关图片 actionBar.setHomeButtonEnabled(false);//是否打开Toggle功能
1
2// set a custom shadow that overlays the main content when the drawer opens mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
1
2
3
4
5
6
7
8
9
10@Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager .beginTransaction()//这里仅仅是做出,选项点击后替换相应的fragment界面"内容" .replace(R.id.container, PlaceholderFragment.newInstance(position + 1)).commit(); Toast.makeText(this, "第->" +(position + 1) +"<-被选中", Toast.LENGTH_SHORT).show(); }
补充:
这里还有两点可以提下:
1、Activity状态的保存
我们一直在Activity的基本方法onCreate( )中见到Bundle savedInstanceState这个参数,从字母意思我们很清楚的理解这就是:被保存的实例状态(信息),但是我们基本只会默认:
1super.onCreate(savedInstanceState);
1
2
3
4
5@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);//把当前选中的位置信息存储到state的某参数下 }
1
2
3
4if (savedInstanceState != null) {//这里在OnCreate()中调用的 mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);//取值和大家熟悉的Intent取值非常相似 mFromSavedInstanceState = true; }
当fragment被销毁时,因为我们回调引用了MainActivity,为避免异常情况的内存泄露的出现, 我们需要将回调置null:
1
2
3
4
5@Override public void onDetach() { super.onDetach(); mCallbacks = null; }
最后
以上就是活泼老虎最近收集整理的关于Android原生”SlidingMenu”框架的代码简析的全部内容,更多相关Android原生”SlidingMenu”框架内容请搜索靠谱客的其他文章。
发表评论 取消回复