DrawerLayout的使用

DrawerLayout:


1.设置菜单弹出的方式:android:layout_gravity="start" (从左往右侧滑)

或 Android:layout_gravity="end"  (从右往左侧滑)


2.ActionBarDrawerToggle的实现:

1.通过点击按钮对Drawer的拉出与隐藏进行事件监听

2.实现了DrawerLayout组件的DrawerListenner的具体实现

3.从写了ActionBarDrawerToggle的onDrawerOpened()和onDrawerClosed()方法


开始写代码:


1.首先,DrawerLayout是android.support.v4下的组件,所以这个jar包必须导入

2.activity_main主视图xml文件中布局两个控件,一个是FrameLayout布局控件和ListView菜单控件

FrameLayout用于显示Fragment(主视图),listView用于显示左侧的菜单栏(可侧滑的菜单)

3.所以我们还需要一个Fragment,


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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="com.example.administrator.drawerlayout002.MainActivity">


    <FrameLayout android:layout_width="match_parent"
                 android:id="@+id/FrameLayout_one"
                 android:layout_height="match_parent">
	<!--显示主视图中的Fragment-->
    </FrameLayout>

	<!--显示左侧菜单栏-->
    <ListView android:layout_width="250dp"
              android:id="@+id/ListView_one"
              android:layout_gravity="start"
              android:divider="@android:color/transparent"
              android:dividerHeight="0dp"
              android:layout_height="match_parent">
	<!--每次点击菜单栏,就new一个Fragment,再将点击的内容显示到new的这个Fragment上-->
    </ListView>
</android.support.v4.widget.DrawerLayout>


上面的代码已将侧滑布局好,接下来就是通过

1.ActionBarDrawerToggle控制侧滑功能的实现,
ActionBarDrawerToggle是DrawerLayout的setDrawerListener事件监听所需要的参数
  实现内部类的两个方法OnDrawerOpened和OnDrawerClosed进行点击时打开还是关闭侧滑
   默认这两个方法都要调用invalidateOptionsMenu方法。
2.通过OnItemClickListenner接口对listview的item进行事件监视

3.若需要在app主视图的右上角添加其他按钮,可以通过新建一个menu来实现
  创建menu的方法直接从写
*1.onCreateOptionsMenu方法,
此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。 返回true则显示该menu,false 则不显示;
getMenuInflater().inflate(R.menu.main, menu);使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象
 menu.add(Menu.NONE,  Menu.First+1 , 0, "设置").setIcon(R.drawable.setting); 可以添加menuitem项
*2.onPrepareOptionsMenu方法进行控制,
在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。 同样的,
		 * 返回true则显示该menu,false 则不显示; (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等
*3.onPrepareMenuClosed
每次菜单被关闭时调用. (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项)

*4.onOptionsItemSelected
菜单项被点击时调用,也就是菜单项的监听方法。 
		 * 通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象
 switch(item.getItemId()) //得到被点击的item的itemId 
        { 
        case  R.id.menu_setting : //这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来 
            break; 
        case R.id.menu_info: 
            break; 
        } 
        return true; 

注意:Android中的菜单有三种模式;optionmenu选项菜单,contextmenu上下文菜单,submenu子菜单

布局文件: 
      在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml  
    <?xml version="1.0" encoding="utf-8"?> 
    <menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id=" @+id/menu_setting " android:title="设置" android:icon="@drawable/setting"></item> 
    </menu> 

*5.onPostCreate   系统彻底跑起来后就执行的回调方法,这里主要是做了
actionBarDrawerToggle.syncState();让Drawerlayout与
actionBarDrawerToggle状态同步
*6.onConfigurationChanged  这个方法会在屏幕发生状态改变时调用,可以在这个方法
中判断当前屏幕是否发生了一些变化,从而改变我们控件中的状态,这里主要是改变了
actionBarDrawerToggle.onConfigurationChanged(newConfig);的状态



MainActivity
package com.example.administrator.drawerlayout_003;

import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.PersistableBundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    private FrameLayout frameLayout;
    private DrawerLayout drawerLayout;
    private ListView listView;
    private String title;
    private List<String> datas;
    private ArrayAdapter<String> adapter;
    private String[] city={"上海","成都","北京","杭州","厦门"};
    private ActionBarDrawerToggle actionBarDrawerToggle;//是一个具体的对象而不是一个控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //绑定xml视图
        setContentView(R.layout.activity_main);
        //获取主视图的标题
        title=(String)getTitle();
        //初始化主视图中的控件
        frameLayout=(FrameLayout) findViewById(R.id.FrameLayout_one);
        drawerLayout=(DrawerLayout)findViewById(R.id.activity_main);
        listView=(ListView)findViewById(R.id.ListView_one);
        //为listview要显示的数据datas赋值
        datas=new ArrayList<String>();
        datas.addAll(Arrays.asList(city));
        //创建一个适配器的实例,并将适配器给listview控件
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,datas);
        listView.setAdapter(adapter);
        //为listview的item添加点击事件
        listView.setOnItemClickListener(this);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        //在主视图左上角上创建一个bar按钮,用于点击显示或隐藏侧滑栏(菜单控制开关)
        actionBarDrawerToggle=new ActionBarDrawerToggle(
                this, drawerLayout,null,R.string.open,R.string.close
        ){
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getSupportActionBar().setTitle(title);
                invalidateOptionsMenu();
            }
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                getSupportActionBar().setTitle("请选择城市");
                invalidateOptionsMenu();
            }
        };
        //开启actionbar,此方法需要sdk最低版本大于等于11,使actionBar控件能在这个视图上显示
         if(NavUtils.getParentActivityName(MainActivity.this)!=null){
        }
        //开启actionbar,此方法需要sdk最低版本大于等于14,使点击actionBar控件时能有响应
        //为DrawerLayout绑定开和关的监听事件
        drawerLayout.setDrawerListener(actionBarDrawerToggle);
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView listView=(ListView)parent;
        Fragment contentFragment=new ContentFragment();
        Bundle bundle=new Bundle();
        bundle.putString("text",datas.get(position));
        contentFragment.setArguments(bundle);
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.FrameLayout_one,contentFragment);
        fragmentTransaction.commit();
        actionBarDrawerToggle.onDrawerClosed(view);
        drawerLayout.closeDrawer(listView);
     }
    //用于在标题栏创建一个ActionBar的menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean isDrawerOpen=drawerLayout.isDrawerOpen(listView);
        //将menu设置为不可见
        menu.findItem(R.id.action_settings).setVisible(!isDrawerOpen);

        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(actionBarDrawerToggle.onOptionsItemSelected(item)){
            return true;
        }
        if(item.getItemId()==R.id.action_settings){
            Intent intent=new Intent();
            intent.setAction("android.intent.action.VIEW");
            Uri uri=Uri.parse("http://www.baidu.com/");
            intent.setData(uri);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        //将actionBar与DrawerLayout的状态同步
        actionBarDrawerToggle.syncState();
    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        actionBarDrawerToggle.onConfigurationChanged(newConfig);
    }
}
Fragment
package com.example.administrator.drawerlayout_003;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 每点击一下list菜单就会new一个Fragment用于主视图显示
 */
public class ContentFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View view= inflater.inflate(R.layout.layout_fragment,container,false);//绑定视图
        TextView textView=(TextView)view.findViewById(R.id.TextView_One);
        String text=getArguments().getString("text");
        textView.setText(text);
        Log.i("info", "onCreateView: "+text);
        return view;
    }
}
Menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
<item
        android:id="@+id/action_settings"
        android:icon="@drawable/ic_action_name"
        android:showAsAction="never"
        android:title="@string/action_settings"
        tools:ignore="AppCompatResource"/>
<item
        android:id="@+id/action_settings1"
        android:icon="@drawable/ic_action_name"
        android:showAsAction="collapseActionView"
        android:title="@string/action_settings"
        tools:ignore="AppCompatResource"/>
<item
        android:id="@+id/action_settings2"
        android:icon="@drawable/ic_action_name"
        android:showAsAction="collapseActionView"
        android:title="@string/action_settings"
        tools:ignore="AppCompatResource"/>
<item
        android:id="@+id/action_settings3"
        android:icon="@drawable/ic_action_name"
        android:showAsAction="collapseActionView"
        android:title="@string/action_settings"
        tools:ignore="AppCompatResource"/>
</menu>



布局layout_fragment.xml
<?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">

    <TextView android:layout_width="match_parent"
              android:id="@+id/TextView_One"
              android:textSize="16sp"
              android:gravity="center"
              android:text="@string/_132132132"
              android:textColor="#000000"
              android:background="#dfd399"
              android:layout_height="match_parent"/>
</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值