首先介绍一下动作条,ActionBar就是活动最顶部的那个标题栏。但只能位于活动的顶部,多有不便。Google便又推出了ToolBar,它继承了ActionBar的所有功能,并且灵活性高。ToolBar一般会有个主题,在style.xml中定义。

动作项一般为ToolBar中的按钮或文本,在menu文件布局中定义,通过<item>为菜单增加菜单项,new menu之后,需要调用

onCreateOptionsMenu(Menu menu)方法,为动作条增加动作项,然后再调用onOptionsItemSelected(MenuItem item) ,实现动作的监听

菜单布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"tools:context=".MainActivity"><itemandroid:id="@+id/action_create_order"android:title="@string/action_create_order"android:icon="@drawable/ic_add_white_24dp"android:orderInCategory="1"android:showAsAction="ifRoom"/><itemandroid:id="@+id/action_settings"android:title="@string/action_settings"android:orderInCategory="100"android:showAsAction="never"/><itemandroid:id="@+id/action_share"android:title="@string/action_share"android:orderInCategory="2"android:showAsAction="ifRoom"android:actionProviderClass="android.widget.ShareActionProvider"/></menu>

 

红圈就是菜单布局中定义的创建订单。白圈是定义的隐藏菜单项,内有设置和分享功能

再介绍下DrawerLayout,抽屉布局,就是将一些菜单选项隐藏起来。在主布局中定义,一般,此布局由两部分组成,一个<Fragment>,一个列表布局.在列表布局中

android:layout_gravity="start"是必须的,因为要知道列表布局布局到底是从屏幕左边加载还是右边加载,要不然就会出现闪退的错误。DrawerLayout布局如下:

<android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/content_frame"android:layout_width="match_parent"android:layout_height="match_parent"/><ListViewandroid:id="@+id/drawer"android:layout_width="240dp"android:layout_height="match_parent"android:choiceMode="singleChoice"android:layout_gravity="start"android:divider="@android:color/transparent"android:dividerHeight="0dp"android:background="#ffffff"/>
</android.support.v4.widget.DrawerLayout>

活动启动时的主界面。左边的三横按钮是抽屉布局的图标。可以看到界面显示了Top Fragment,这是由代码控制默认显示的。

当我们点击抽屉按钮时,其隐藏的子片段会显示出来,这里用列表定义了4个子片段。然后每个子片段有自己的ID号和详细内容

再附上主方法的源代码

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ShareActionProvider;public class MainActivity extends Activity {private ShareActionProvider shareActionProvider;//共享动作私有变量private String[] titles;private ListView drawerList;private DrawerLayout drawerLayout;private ActionBarDrawerToggle drawerToggle;private int currentPosition = 0;private class DrawerItemClickListener implements ListView.OnItemClickListener {//创建一个监听器@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {selectItem(position);//单击一项是调用此方法}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);titles = getResources().getStringArray(R.array.titles);//获得标题数组drawerList = (ListView) findViewById(R.id.drawer);//抽屉列表布局drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);//抽屉布局,一个片段+列表布局drawerList.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, titles));//初始化抽屉列表drawerList.setOnItemClickListener(new DrawerItemClickListener());//响应列表布局的单击事件if (savedInstanceState != null) {currentPosition = savedInstanceState.getInt("position");//保存当前位置setActionBarTitle(currentPosition);//活动被撤销后,重新创建,保留前一个状态的标题} else {selectItem(0);//初次创建活动是,选择TopFragment}//create the ActionBarDrawerToggle,特殊类型的抽屉监听器drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,R.string.open_drawer, R.string.close_deawer) {public void onDrawerClosed(View view) {super.onDrawerClosed(view);invalidateOptionsMenu();//显示菜单项有变化}public void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);invalidateOptionsMenu();}};drawerLayout.setDrawerListener(drawerToggle);//设置监听器getActionBar().setDisplayHomeAsUpEnabled(true);//向上按钮getActionBar().setHomeButtonEnabled(true);//
//后退堆栈改变时,调用此方法getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {@Overridepublic void onBackStackChanged() {FragmentManager fragmentManager = getFragmentManager();Fragment fragment = fragmentManager.findFragmentByTag("visible_fragment");if (fragment instanceof TopFragment) {currentPosition = 0;}if (fragment instanceof PizzaFragment) {currentPosition = 1;}if (fragment instanceof PastaFragment) {currentPosition = 2;}if (fragment instanceof StoresFragment) {currentPosition = 3;}setActionBarTitle(currentPosition);//设置动作条标题drawerList.setItemChecked(currentPosition, true);}});}//切换帧布局中的片段,单击ListVIew中的一项时要调用此方法private void selectItem(int position) {currentPosition = position;Fragment fragment;switch (position) {//所点击的项在ListView中的位置case 1:fragment = new PizzaFragment();break;case 2:fragment = new PastaFragment();break;case 3:fragment = new StoresFragment();break;default:fragment = new TopFragment();}//切换片段事物FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();fragmentTransaction.replace(R.id.content_frame, fragment,"visible_fragment");fragmentTransaction.addToBackStack(null);fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);fragmentTransaction.commit();setActionBarTitle(position);//设置动作条标题//当单击了某个列表项时,列表布局关闭drawerLayout.closeDrawer(drawerList);}//改变动作条标题private void setActionBarTitle(int position) {String title;if (position == 0) {title = getResources().getString(R.string.app_name);} else {title = titles[position];}getActionBar().setTitle(title);//显示动作条的标题}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("position", currentPosition);}/// called whenever 调用了invalidateOptionsMenu()@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {//如果抽屉打开,则设置共享动作为falseboolean drawerOpen = drawerLayout.isDrawerOpen(drawerList);menu.findItem(R.id.action_share).setVisible(!drawerOpen);return super.onPrepareOptionsMenu(menu);}@Override/*将菜单资源文件中的菜单项增加到动作条中,即为动作条增加动作项*/public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);//R.menu.menu_main是菜单资源文件,menu是动作条MenuItem menuItem = menu.findItem(R.id.action_share);//得到共享动作提供者的一个引用shareActionProvider = (ShareActionProvider) menuItem.getActionProvider();setIntent("This is example text");//默认文本return super.onCreateOptionsMenu(menu);}/*setIntent(String text)会创建·一个·意图,并通过shareActionProvider.setShareIntent(intent)来传递这个意图*/private void setIntent(String text) {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, text);shareActionProvider.setShareIntent(intent);}@Override//响应动作条中动作,item是单击的动作条上单击的动作项,public boolean onOptionsItemSelected(MenuItem item) {if (drawerToggle.onOptionsItemSelected(item)) {return true;//让ActionBarDrawerToggle处理单击事件}switch (item.getItemId()) {//获得所单击动作项的IDcase R.id.action_create_order:Intent intent = new Intent(this, OrderActivity.class);startActivity(intent);return true;case R.id.action_settings:return true;default:return super.onOptionsItemSelected(item);}}@Override//syncState()方法保证抽屉图标的状态和抽屉布局状态一致protected void onPostCreate(@Nullable Bundle savedInstanceState) {super.onPostCreate(savedInstanceState);drawerToggle.syncState();}@Override//如股配制发生改变,Call 会使配制变化传递到ActionBarDrawerTogglepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);drawerToggle.onConfigurationChanged(newConfig);}
}

详情请参考https://dogriffiths.github.io/HeadFirstAndroid/#/

新手小白学习,如有错误,请多多指正!

安卓开发Material Design ToolBar的DrawerLayout 学习经验相关推荐

  1. Material Design控件使用学习 toolbar+drawerlayout+ Snackbar

    效果 1.,导包design包和appcompat-v7 ,设置Theme主题Style为NoActionbar 2.custom_toolbar.xml <?xml version=" ...

  2. Android UI开发——Material Design界面设计【详细】

    转自:http://colachan.com/post/3416 找了很多Material Design的资料,终于找到一篇比较靠谱的.能看懂的,我认为非常有用的学习资料,就像他们说的,只要你按Mat ...

  3. Android UI开发——Material Design界面设计风格

    自从Material design发布以来,可乐橙就在一直收集相关素材与资源,研究别人的作品.这套设计风格非常鲜明,带有浓郁的Google式严谨和理性哲学,深得我心.实际上,光是研究素材和别人作品,就 ...

  4. android md 颜色,安卓MD(Material Design)规范

    Md规范是一种设计风格,并不特指规范.是一种模拟纸张的手法. 一.核心思想 把物理世界的体验带进屏幕.去掉现实中的杂质和随机性,保留其最原始纯净的形态.空间关系.变化与过度,配合虚拟世界的灵活特性,还 ...

  5. 补充嵌入式后期的开发~~分享一下自己的嵌入式学习经验~~也纪念一下即将逝去的青春

    自己的嵌入式学习经验~~也纪念一下即将逝去的青春 大一听说嵌入式很有挑战性,菜鸟也想挑战一下下,就开始了我的学习之旅,但是后来发现上了操作系统的arm完全没有自己想象的那么简单,简单的led程序都不会 ...

  6. 安卓开发招聘!免费Android高级工程师学习资源,2年以上经验必看

    现状 后端转 Android 我该从何处下手,现在学习 android 晚吗? 我的回答是晚还不至于,因为目前是市场趋于稳定正常,这个是市场发展的比如趋势,现在火爆大家都看好的人工智能,大数据,犹如2 ...

  7. 安卓开发新手入门教程!Android学习路线指南,复习指南

    互联网现状 如今的互联网,延续了2018年的态势.虽然前些年,每到年底的时候大环境都不好,然而来年照样春暖花开.但是现在的互联网环境是真的不好了. 首先各大公司争相优化员工,小公司我就不提了,咱就只说 ...

  8. Material Design控件使用学习 TabLayout+SwipeRefreshlayout

    效果: Tablayout有点类似之前接触过的开源ViewPagerIndicator,将其与viewpager绑定,可实现viewpager的导航功能. SwipeRefreshLayout是官方出 ...

  9. Android开发之Android Material Design Toolbar自定义随笔

    一.自定义Toolbar的menu: 在menu下新建menu.xml文件,自定义menu的样式: 1 <menu xmlns:android="http://schemas.andr ...

最新文章

  1. HAProxy+Keepalived高可用负载均衡配置
  2. 大型油烟机清洗机器人_高利洁大型油烟机清洗设备简介
  3. C++horspool算法查找字符串是否包含子字符串(附完整源码)
  4. matlab中 注意事项--字符串
  5. Wince6 Eboot中加入开机画面
  6. 在GZIDG弄服务器的这一整夜,快乐
  7. python copy()和deepcopy()解释(import copy)
  8. 项目周期一般多久_积木创意:影响小程序开发外包的周期因素有哪些?
  9. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读
  10. php处理post表单数据,php – Httpful post表单数据
  11. MySQL进阶路:从小工到专家的必读书籍和必备工具
  12. C - The Smallest String Concatenation CodeForces - 632C(按字典序列排列 )string或者数组
  13. js事件冒泡和事件捕获的区别
  14. mapbox gl本地化部署实践
  15. 【华为MateBook13】更换1TB固态硬盘SSD+重装win10系统+安装NVIDIA显卡驱动+电脑管家+指纹驱动+蓝牙驱动+Office激活
  16. 对 广义相对论 的 评价
  17. Lego Boost打算把所有乐高玩具变成可编程机器人
  18. 电脑无法正常开机时如何解除BitLocker硬盘锁
  19. 仿腾讯QQ竖直滑动导航菜单
  20. 分布式数据库和多活数据库的区别

热门文章

  1. java模拟手机浏览web_在PC上测试移动端网站和模拟手机浏览器的5大方法
  2. Android/IOS 实现接触NFC自动跳转到App,如果未安装App,则跳转到应用市场
  3. RatingDapp 数据周报 (2019/3/24 ~ 3/30)
  4. 网狐棋牌游戏平台服务器架构设计分析[转]
  5. 基于Ubuntu(x86)系统和STM32(Keil)编写C程序分别进行编程、验证
  6. 手把手入门WEB信息收集
  7. html5带倍速功能的视频播放器(加速2倍,1.5倍播放)
  8. [iOS]判断ipa是否脱壳
  9. 已解决 阿里云盘 应用网络状况不佳,扫码,用账号登录,用手机号登录都不可以
  10. Java,第一次作业——六边形面积