标签 layout 下的文章

DrawerLayout滑动菜单


这个布局允许放置两个直接子控件,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容。因此,我们就可以对activity_main.xml中的代码做如下修改:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <子控件1 />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:text="This is menu"
        android:textSize="30sp"
        android:background="#da9797" >

        <TextView
            android:text="menu1"
            android:textSize="12sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:text="menu2"
            android:textSize="12sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

这里最外层的控件使用了DrawerLayout,这个控件是由support-v4库提供的。第一个子控件是用于作为主屏幕中显示的内容,第二个子控件用于作为滑动菜单中显示的内容,但是关于第二个子控件有一点需要注意,layout_gravity 这个属性是必须指定的,因为我们需要告诉DrawerLayout滑动菜单是在屏幕的左边还是右边,指定left表示滑动菜单在左边,指定right表示滑动菜单在右边。这里我指定了start,表示会根据系统语言进行判断,如果系统语言是从左往右的,比如英语、汉语,滑动菜单就在左边,如果系统语言是从右往左的,比如阿拉伯语,滑动菜单就在右边。

不过现在的滑动菜单还有点问题,因为只有在屏幕的左侧边缘进行拖动时才能将菜单拖出来,而很多用户可能根本就不知道有这个功能,那么该怎么提示他们呢?
Material Design建议的做法是在Toolbar的最左边加入一个导航按钮,点击了按钮也会将滑动菜单的内容展示出来。这样就相当于给用户提供了两种打开滑动菜单的方式,防止一些用户不知道屏幕的左侧边缘是可以拖动的。

修改MainActivity代码:

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //首先调用findViewById() 方法得到了DrawerLayout的实例,
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        //然后调用getSupportActionBar() 方法得到了ActionBar的实例
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);//setDisplayHomeAsUpEnabled() 方法让导航按钮显示出来
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);//setHomeAsUpIndicator() 方法来设置一个导航按钮图标
        }
    }

    ...

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    //在onOptionsItemSelected() 方法中对HomeAsUp按钮的点击事件进行处理,HomeAsUp按钮的id永远都是android.R.id.home
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawerLayout.openDrawer(GravityCompat.START);
                break;
            ...
            default:
        }
        return true;
    }

}

openDrawer函数

openDrawer

added in version 22.0.0
void openDrawer (int gravity)
Open the specified drawer by animating it out of view.

Parameters
gravity int: Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right. GravityCompat.START or GravityCompat.END may also be used.


shijiebei 365bet manbetx 188bet xinshui caipiao 95zz tongbaoyule beplay 88bifa 18luck betway bwin hg0088 aomenjinshayulecheng ca88 shenbotaiyangcheng vwin w88 weide