DrawerLayout实现侧滑

有没有很想实现这样子的界面,本来我还在想要怎么实现呢,后来发现有个类DrawerLayout可以轻松实现

Drawer是意思是抽屉,顾名思义,这个类帮我们实现一个抽屉一样的布局,把旁边的列表拉出来




下面代码实现啦!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <android.support.v4.widget.DrawerLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <FrameLayout
                android:id="@+id/main_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></FrameLayout>
            </RelativeLayout>
        <ListView android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#ffde1b45"/>

        </android.support.v4.widget.DrawerLayout>

</RelativeLayout>

分别是主界面,一般会放入Fragment

和右划,显示左边列表

主界面必须放在最上面哦,这是必须的

ListView的layout_gravity是start,一般会写成left,但是google建议写成start


    DrawerLayout drawerLayout;
    ListView leftLv;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<String> arrayList;
    String[] strings={"Hello","good day","bye bye"};
    Fragment fragment;
    HelloFragment helloFragment;
    ByeByeFragment byeByeFragment;
    GoodDayFragment goodDayFragment;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        drawerLayout= (DrawerLayout) findViewById(R.id.drawer_layout);
        leftLv=(ListView) findViewById(R.id.left_drawer);
        arrayAdapter=new ArrayAdapter<String>(this,R.layout.layout_list,R.id.list_item,strings);
        leftLv.setAdapter(arrayAdapter);


        FragmentManager fm=getFragmentManager();
        FragmentTransaction ft=fm.beginTransaction();
        if(helloFragment==null)
        {
            helloFragment=HelloFragment.newInstance("","");
            ft.add(R.id.main_content, helloFragment).commit();
        }
        leftLv.setOnItemClickListener(new DrawerItemClickListener());


    }
主界面显示“Hello blank fragment”,是HelloFragment,左侧拉出列表显示"Hello","good day","bye bye"

直接调用,什么都没修改,看看效果图



真是不能再丑了,可以看到原来的Fragment变灰了,而且反应超不灵敏,划了半天没划出来,还以为没实现呢。

不过网易新闻也是超不灵敏的,所以像网易新闻那样在action bar上有个控制drawer的item是必要的。



好吧,下面开始升级


处理点击事件

添加左侧列表的OnItemClickListener


    class  DrawerItemClickListener implements AdapterView.OnItemClickListener {


        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            FragmentManager fm=getFragmentManager();
            FragmentTransaction ft=fm.beginTransaction();
            Log.e("sjj","position="+position);
            switch (position)
            {
                case  0:fragment=new HelloFragment();break;
                case 1:fragment=new GoodDayFragment();break;
                case 2:fragment=new ByeByeFragment();break;
            }
            ft.replace(R.id.main_content,fragment).commit();//显示关联的Fragment
            leftLv.setItemChecked(position, true);//高亮显示被点击item
            drawerLayout.closeDrawer(leftLv);//关闭leftLv

        }
    }

点击第二个item,跳转到这个Fragment




监听open和close事件

实现DrawerLayout.DrawerListener接口,这个接口提供回调方法onDrawerOpened() 和 onDrawerClosed()

 DrawerLayout.setDrawerListener() 

另一种方法,如果activity包含action bar,可以选择继承ActionBarDrawerToggleActionBarDrawerToggle已经实现了DrawerLayout.DrawerListener接口。

当内容被DrawerLayout改变了,应该修改action bar,比如修改title和action bar的item

可以通过重写DrawerLayout.DrawerListener的回调方法实现

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...

        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };

        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值