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); } }Fragmentpackage 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>