DrawerLayout,Toolbar

DrawerLayout

        侧滑菜单。在support-v4包中,当用户手指从屏幕边缘开始滑动时,会将侧滑菜单滑开。一般将它做为布局的根节点,它的第一个子view就是要显示的内容区域,其余的子view都属性侧滑菜单。

        对于内容区域,它的宽高一般为match_parent,一定是Drawerlayout的第一个子view

        对于侧滑菜单,可以分为左边和右边的,通过layout_gravity属性指定:该属性的值为left时就是左边侧滑菜单,为right是就是右边侧滑菜单。

        可以通过setDrawerListener(DrawerListener)设置侧滑的监听。

常用方法

        setDrawerListener():设置监听。

        openDrawer(int|View):打开指定的侧滑菜单。int为Gravity中的值,Gravity.LEFT打开左边侧滑菜单,Gravity.RIGHT打开右边侧滑菜单。

        closeDrawer(int|View):同openDrawer()。

        setDrawerLockMode(int):设置菜单的打开方式。参数为DrawerLayout.LOCK_MODE_*。DrawerLayout.LOCK_MODE_LOCKED_CLOSED:用户无法通过手指滑开菜单,只能通过代码打开。LOCK_MODE_LOCKED_OPEN:用户无法关闭菜单,只能通过代码控制。LOCK_MODE_UNLOCKED:用户可以随心所欲地打开关闭。

        setDrawerShadow():设置菜单的阴影图片。因为侧滑菜单占不满全屏,在空白区域就是shadow。

Toolbar

        toolbar是actionbar的升级版,但比actionbar要方便灵活地多。一般来说,actionbar是一个Activity界面的一部分,并且由framework层控制但toolbar却不是它就像一个view一样(它本身就是继承于ViewGroup),可以放置在任何地方,放置到任意的视图层级中。

        toolbar与actionbar最大的区别在于:toolbar会自动生成溢出菜单(overflow menu),无论有无实体菜单键;而actionbar只有在没有实体菜单键的时候才会自动生成溢出菜单

        如果想像actionbar一样使用toolbar,也可以调用activity#setSupportActionBar(Toolbar)将toolbar转换成actionbar。一旦转换为actionbar后, 就需要通过onCreateOptionsMenu()与onOptionsItemSelected()进行操作。

       对于toolbar来说,它加载的也是menu菜单。其几个view如下:


使用        

        toolbar本身是一个viewgroup,因此其内部可以放子View。也可以通过子View的layout_gravity设置子View所处的位置。如下:

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="?attr/colorPrimary"
                android:minHeight="?attr/actionBarSize"
                android:theme="@style/Toolbar"
                android:gravity="center_horizontal"
                app:popupTheme="@style/TestToolbar" >
                <TextView
                    android:layout_gravity="center_horizontal"
                    android:gravity="center_horizontal"
                    android:textColor="@android:color/black"
                    android:textSize="20dp"
                    android:text="title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            </android.support.v7.widget.Toolbar>
        上述代码,在toolbar内部设置了一个TextView,并且使其水平居中。因此,显示的时候会在toolbar的中间显示出一个title。利用这种性质,完全可以写成仿iOS的titleView——再也不怕设计仿iOS设计,而非得自定义titleView了。

溢出菜单

         在使用toolbar时,溢出菜单是与toolbar顶部齐平的,可能不满足某些设计。此时可以不使用默认的溢出菜单,而将溢出菜单的位置设置一个icon,并结合popupmenu达到效果。如下:

    @Override
    public void showFilteringPopUpMenu() {
        PopupMenu popup = new PopupMenu(getContext(), getActivity().findViewById(R.id.menu_filter));
        popup.getMenuInflater().inflate(R.menu.filter_tasks, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.active:
                        mPresenter.setFiltering(TasksFilterType.ACTIVE_TASKS);
                        break;
                    case R.id.completed:
                        mPresenter.setFiltering(TasksFilterType.COMPLETED_TASKS);
                        break;
                    default:
                        mPresenter.setFiltering(TasksFilterType.ALL_TASKS);
                        break;
                }
                return true;
            }
        });

        popup.show();
    }
        点击toolbar是某个按钮时的操作。

常用方法

        inflateMenu():为toolbar填充对应的布局,参数为menu布局。如果该toolbar被当作了setSupportActionBar的参数,那么该方法无效。

        setOnMenuItemClickListener():设置toolbar中每一个item的点击事件。

        setNavigationIcon():设置导航的图标。显示在toolbar的最左边

        setNavigationOnClickListener():设置导航图标的点击事件。

常用属性

        titleTextAppearance:设置title显示的样式

        subtitleTextAppearance:设置subtitle显示的样式

        popupTheme:溢出菜单的样式。可以通过它控件溢出菜单显示的文字颜色等。

注意

        1,当前activity的theme应为@style/Theme.AppCompat子类。

        2,为兼容低版本,activity要继承AppCompatActivity

        3,将toolbar转换为actionbar后,需要将原来自带的actionbar给删除。可以将该activity的theme继承@style/Theme.AppCompat.NoActionBar或者添加上

<item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

ActionBarDrawerToggle

        它实质是DrawerLayout.DrawerListener,因此它可以用在setDrawerListener()方法中。但它实质上也如一下view一样,在DrawerLayout滑动的时候,toggle显示的内容会随之变化。

        它本身可以连接toolbar与DrawerLayout,并且做为toolbar的navigation icon使用。

        初始化toggle后,需要调用它的syncState(),在这里才会将toggle设置为toolbar的navigation icon。

示例

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        content = (TextView) findViewById(R.id.root);
        layout = (DrawerLayout) findViewById(R.id.co);
        bar = (Toolbar) findViewById(R.id.tool);
        bar.inflateMenu(R.menu.menu_toolbar);
        bar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    //menu item click
                }
                return true;
            }
        });
        ListView menu = (ListView) findViewById(R.id.menu);
        List<Map<String, Object>> data = new ArrayList<>();
        for (int x = 0; x < 3; x++) {
            Map<String, Object> map = new HashMap<>();
            map.put("icon", ICON_IDS[x]);
            map.put("title", getResources().getString(TITLES[x]));
            data.add(map);
        }
        menu.setAdapter(new SimpleAdapter(this, data, R.layout.activity_plugin, new String[]{"title", "icon"}, new int[]{R.id.item_title, R.id.item_icon}));
        menu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //侧滑菜单的点击事件
                layout.closeDrawer(Gravity.LEFT);
            }
        });
        //My extends ActionBarDrawerToggle。
        My my = new My(layout,bar);
        layout.setDrawerListener(my);
        my.syncState();//将My与Toolbar关联
    }
        其布局为
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--顶部的toolbar-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/tool"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:title="title" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/co"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!--内容区域,一般该区域可以使用fragment-->
        <TextView
            android:id="@+id/root"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="这是内容区域" />
        <!--左滑菜单-->
        <ListView
            android:id="@+id/menu"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:background="@android:color/holo_green_light" />
    </android.support.v4.widget.DrawerLayout>
</LinearLayout>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值