侧滑-抽屉界面在主界面的左边或者右边,拉出来的效果

侧滑的实现,可以左侧抽屉和右侧抽屉同时存在

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;
    }
}

效果如如下:

posted @ 2016-06-06 17:36  ts-android  阅读(1764)  评论(0编辑  收藏  举报