侧滑-抽屉界面在主界面的左边或者右边,拉出来的效果
侧滑的实现,可以左侧抽屉和右侧抽屉同时存在
1.实现侧滑的xml布局文件如下:activity_main.xml
<!-- 侧滑菜单的布局 打个id就会自动出现xmlns属性 注意事项: 1.主内容视图一定要是DrawerLayoout的第一个子视图 2.主内容视图宽度和高度匹配父视图,即 match_parent 3.必须显示指定抽屉视图(如ListView)的layout_gravity属性 1)、属性设为"start"时,从左向右滑出菜单 2)、属性设为"end"时,从右向左滑出菜单 3)、不推荐使用"left"和"right" 4.抽屉视图的宽度以dp为单位,请不要超过320dp(为了总能看到一些主内容)--> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主视图 --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> <!-- 左侧的侧滑视图 layout_gravity="start"代表侧滑在左边 android:divider="@android:color/transparent" 代表ListView的分割线为透明 android:choiceMode="singleChoice" 单选模式--> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#ffffcc" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp"/> </android.support.v4.widget.DrawerLayout>
2.菜单项布局文件main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.ts.work.MainActivity" > <!-- 将活动条显示的菜单设置为如下:图标为系统的搜图片 android:showAsAction="ifRoom|withText" 有空间就显示图标和文字--> <item android:id="@+id/action_websearch" android:icon="@android:drawable/ic_menu_search" android:showAsAction="ifRoom|withText" android:title="搜索"/> </menu>
3.fragment_content.xml布局文件:为点击ListView创建视图显示所需要的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="50sp" android:textColor="#ff0000"/> </LinearLayout>
4.java代码如下:
public class MainActivity extends Activity{ private DrawerLayout drawerLayout; private FrameLayout content_frame; private ListView drawer_list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);//抽屉与主视图的布局 content_frame = (FrameLayout) findViewById(R.id.content_frame);//主视图(帧布局) //为左边的抽屉侧滑视图添加数据 drawer_list=(ListView) findViewById(R.id.left_drawer);//抽屉视图(ListView) final ArrayList<String> list=new ArrayList<String>(); for(int i=1;i<5;i++){ list.add("侧滑抽屉 "+i); } ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list); drawer_list.setAdapter(adapter); //为抽屉列表设置监听,使得点击不同的列表项能插入不同的Fragment视图 drawer_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //当点击ListView条目时,动态添加一个fragment到FrameLayout(主视图)当中 Fragment contentFragment=new ContentFragment();//创建一个自定义的Fragment对象 Bundle bundle=new Bundle(); bundle.putString("text", list.get(position));//将点击的内容添加到bundle中 contentFragment.setArguments(bundle);//为Fragment设置参数,将数据传送过去 //得到碎片视图管理者 FragmentManager fragmentManager = getFragmentManager(); //开始执行操作的对象(开启事务) FragmentTransaction transaction = fragmentManager.beginTransaction(); //表示将contentFragment视图替换id为content_frame的视图 transaction.replace(R.id.content_frame, contentFragment).commit();//替换视图并提交 //将抽屉视图隐藏 drawerLayout.closeDrawer(drawer_list); } }); //监听抽屉侧滑的打开与关闭 final String title=(String) getTitle();//获取最开始的标题 drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerStateChanged(int arg0) { System.out.println("状态改变的时候调用"); } @Override public void onDrawerSlide(View arg0, float arg1) { //System.out.println("滑动的时候调用"); } @Override public void onDrawerOpened(View arg0) { getActionBar().setTitle("请选择"); System.out.println("抽屉打开的时候调用"); //重绘活动条的菜单项 invalidateOptionsMenu();//使当前菜单无效,会回调onCreateOptionsMenu方法 } @Override public void onDrawerClosed(View arg0) { getActionBar().setTitle(title); System.out.println("抽屉关闭的时候调用"); //当抽屉关闭的时候也要去回调onCreateOptionsMenu方法,才能修改菜单项的显示 invalidateOptionsMenu();//使当前菜单无效,会回调onCreateOptionsMenu方法 } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { System.out.println("回调onCreateOptionsMenu方法后会自动调用onPrepareOptionsMenu方法"); getMenuInflater().inflate(R.menu.main, menu);//将菜单显示出来 return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { System.out.println("onPrepareOptionsMenu方法被调用"); //判断抽屉的ListView是否打开 boolean drawerOpen = drawerLayout.isDrawerOpen(drawer_list); //如果抽屉打开了就将活动条中的搜索菜单隐藏 if(drawerOpen){ menu.findItem(R.id.action_websearch).setVisible(false);//通过菜单id找到菜单项 }else{ menu.findItem(R.id.action_websearch).setVisible(true); } return super.onPrepareOptionsMenu(menu); } //菜单项的点击事件 @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()==R.id.action_websearch){ System.out.println("点击了搜索菜单项"); } return super.onOptionsItemSelected(item); } }
5.上面代码创建视图所需要的类 ContentFragment.java
/*该类的作用: 当创建一个该类对象时,该对象就是一个视图,并且该视图能接收传递过来的数据 */ public class ContentFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //找到定义的一个布局文件 View view = inflater.inflate(R.layout.fragment_content, container, false); //找到该布局文件中的组件 TextView textView = (TextView) view.findViewById(R.id.textView); //得到创建这个视图传递过来的参数 String string = getArguments().getString("text"); textView.setText(string);//将数据放到TextView中显示出来,区分每次点击的ListView return view; } }
效果如如下: