概述
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,用来显示“应用内容”的“界面”载体:
<!--
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" />
和一个固定的抽屉fargment,显示抽屉控件的载体:
<!--
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" />
使用android:name前缀来引用具体的fragment,这里的NavigationDrawerFragment继承fragment的子类。
当程序启动时,MainActivity.java->onCreate()方法时,首先加载了R.layout.activity_main布局,再通过FragmentManager加载"抽屉"的fragment,并调用NavigationDrawerFragment.setUp()方法(设置)初始化抽屉布局的使用环境,包括抽屉布局的背景、ActionBar、抽屉监听类mDrawerToggle。
1、mDrawerToggle实现了对抽屉打开事件onDrawerOpened和关闭事件onDrawerClosed的监听,同时实现了打开状态和关闭状态的标志图片的显示。
2、通过对ActionBar的设置,可以实现HomeButton的图片的显示和toggle开关功能的开关:
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);//是否显示Toggle开关图片
actionBar.setHomeButtonEnabled(false);//是否打开Toggle功能
3、设置抽屉布局的透明背景和风格
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
NavigationDrawerFragment几个关键方法的执行顺序是onCreate()->onCreateView()->setUp()->onActivityCreated(),抽屉列表的初始化和点击事件就是在onCreateView()中实现的,只是调用了自定义方法selectItem(int position),只不过在方法中回调了MainActivity中实现NavigationDrawerFragment.NavigationDrawerCallbacks的接口方法onNavigationDrawerItemSelected():
@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();
}
这样就基本实现了“抽屉”或SlidingMenu的菜单效果,抽屉布局类DrawerLayout是应用android.support.v4.widget.DrawerLayout,所以支持Android各版本。
补充:
这里还有两点可以提下:
1、Activity状态的保存
我们一直在Activity的基本方法onCreate( )中见到Bundle savedInstanceState这个参数,从字母意思我们很清楚的理解这就是:被保存的实例状态(信息),但是我们基本只会默认:
super.onCreate(savedInstanceState);
,所以这里它既然提到了我们顺便讲解一下相应的用法。其实Activity类为我们提供了相应的状态信息保存机制,就是onSaveInstanceState(),这里我们看下抽屉类是怎么保存状态的:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);//把当前选中的位置信息存储到state的某参数下
}
然后保存到应用Activity状态是如何使用的,:
if (savedInstanceState != null) {//这里在OnCreate()中调用的
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);//取值和大家熟悉的Intent取值非常相似
mFromSavedInstanceState = true;
}
2、回调callback处理
当fragment被销毁时,因为我们回调引用了MainActivity,为避免异常情况的内存泄露的出现, 我们需要将回调置null:
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
onDetach是在fragment销毁时,回调的方法。
最后
以上就是活泼老虎为你收集整理的Android原生”SlidingMenu”框架的代码简析的全部内容,希望文章能够帮你解决Android原生”SlidingMenu”框架的代码简析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复