侧边栏:DrawerLayout 实现

//activity_main.xml



    
    


    

    
    
    
    

        

    

说明:

DrawerLayout 最好为界面的根布局,官网这样说的,否则可能会出现触摸事件被屏蔽的问题;
主内容区的布局代码要放在侧滑菜单布局的前面, 因为 XML 顺序按 z 序(层叠顺序)排序;
侧滑菜单部分的布局必须设置layout_gravity属性,他表示侧滑菜单是在左边还是右边,设置了layout_gravity="start/left"的视图才会被认为是侧滑菜单,如果不设置,在打开关闭抽屉的时候会报错。

//menu_left_drawerlayout.xml



    

        

            

            

            

                

                
            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        

        

            

            
        

        
    


import android.support.annotation.NonNull;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle toggle;

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

        drawerLayout = findViewById(R.id.drawerLayout);

        initActionBar();
    }

    /**
     * 初始化 actionbar
     */
    private void initActionBar() {
        //1.获取 actionbar 对象
        ActionBar actionBar = getSupportActionBar();
        //2.设置 图标、标题
        actionBar.setLogo(R.drawable.ic_launcher);//没效果啊,现在显示的是 ← 符号
        actionBar.setTitle(R.string.app_name);
        actionBar.setSubtitle(R.string.app_name);
        //3.启用、显示 home 按钮
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        //4.替换 home 按钮的图标 (现在显示的是 三条横线 符号)
        toggle = new ActionBarDrawerToggle(this, drawerLayout, 0, 0);
        //设置 actionbar 和 drawerlayout 同步状态
        toggle.syncState();
        //5.三条横线 添加动画 (现在显示的是 三条横线与←符号切换的效果)
        addAnamator(toggle);
        //或
//        addAnamator();
    }

    /**
     * 三条横线 添加动画 (现在显示的是 三条横线与←符号切换的效果)
     */
    private void addAnamator(ActionBarDrawerToggle toggle) {
        drawerLayout.setDrawerListener(toggle);
    }

    /**
     * 三条横线 添加动画 (现在显示的是 三条横线与←符号切换的效果)
     * 建议用 上面的方法 替代
     */
    private void addAnamator() {
        drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(@NonNull View view, float v) {
                toggle.onDrawerSlide(view, v);
            }

            @Override
            public void onDrawerOpened(@NonNull View view) {
                toggle.onDrawerOpened(view);
            }

            @Override
            public void onDrawerClosed(@NonNull View view) {
                toggle.onDrawerClosed(view);
            }

            @Override
            public void onDrawerStateChanged(int i) {
                toggle.onDrawerStateChanged(i);
            }
        });
    }

    /**
     * 点击 actionbar 的 home 按钮,会执行该方法
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home://点击 actionbar 的 home 按钮的点击事件
                setHomeButtonState(item);
                //或
//                setHomeButtonState();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 设置 actionbar 的 home 按钮的点击事件
     *
     * @param item
     */
    private void setHomeButtonState(MenuItem item) {
        toggle.onOptionsItemSelected(item);
    }

    /**
     * 设置 actionbar 的 home 按钮的点击事件
     * 建议用 上面的方法 替代
     */
    private void setHomeButtonState() {
        //如果左边菜单打开,则关闭;如果关闭,则打开
        if (drawerLayout.isDrawerOpen(Gravity.START)) {
            drawerLayout.closeDrawer(Gravity.START);
        } else {
            drawerLayout.openDrawer(Gravity.START);
        }
    }
}

你可能感兴趣的:(android-UI框架)