1.ActionBar

ActionBar 低版本和高版本用法不同

低版本: 1. 引用v7-appcompat 2. Activity继承ActionBarActivity 3. android:theme="@style/Theme.AppCompat.Light" >

高版本:

1. Activity自带actionBar 2.从Android3.0(APIlever11)开始,所有使用Theme.Holo主题(或者它的子类)的activity都包含了actionbar,当

targetSdkVersion或minSdkVersion属性被设置成“11”或更大时,它是默认主题。

所以,为你的activity添加actionbar,只需简单地设置属性为11或者更大。

常用操作:

搜索 

Actionbar允许你为当前上下文中最重要的操作添加按钮。那些直接出现在actionbar中的icon和/或文本被称作action

buttons(操作按钮)。安排不下的或不足够重要的操作被隐藏在actionoverflow中。

1.所有的操作按钮和actionoverflow中其他可用的条目都被定义在菜单资源的XML文件中。通过在项目的res/menu目录中

新增一个XML文件来为actionbar添加操作。(V7、V4只是功能功能不一样,没有升级的说法,要兼容低版本就要全部导V7的包,另外需要自定义命名空间)

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" yourapp:actionViewClass="android.support.v7.widget.SearchView" yourapp:showAsAction="ifRoom"/> <!-- 设置, 在溢出菜单中展示 --> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="never" /> </menu>

2.写监听(错误可以忽略,判断下就可以了)

  1. @SuppressLint("NewApi") @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); // 如果运行的环境 (部署到什么版本的手机 )大于3.0 if (android.os.Build.VERSION.SDK_INT > 11) { SearchView searchView = (SearchView) menu.findItem( R.id.action_search).getActionView(); searchView.setOnQueryTextListener(this);// 搜索的监听 } return true; }

3.处理actionBar菜单条目的点击事件

public boolean onOptionsItemSelected(MenuItem item) {
		if (item.getItemId() == R.id.action_search) {
			Toast.makeText(getApplicationContext(), "搜索", 0).show();
		}
		return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
	}
	// 当搜索提交的时候
	@Override
	public boolean onQueryTextSubmit(String query) {
		Toast.makeText(getApplicationContext(), query, 0).show();
		return true;
	}
	// 当搜索的文本发生变化
	@Override
	public boolean onQueryTextChange(String newText) {
		return true;
	}
}
@Override
public	boolean	onOptionsItemSelected(MenuItem	item)	{
				//	处理动作按钮的点击事件
	switch	(item.getItemId())	{
		case	R.id.action_search:
		     openSearch();
		    return	true;
		case	R.id.action_settings:
		    openSettings();
		    eturn	true;
		default:
		   return	;
super.onOptionsItemSelected(item);
    }
}

返回按钮的处理 

在不是主要入口的其他所有屏中(activity不位于主屏时),需要在actionbar中为用户提供一个导航到逻辑父屏的up

button(向上按钮)。

1.在另一个activity

  1. protected void initActionBar() { super.initActionBar(); ActionBar actionBar = getSupportActionBar();//通过这样或得actionbar actionBar.setDisplayHomeAsUpEnabled(true); // 如果你的minSdkVersion属性是11活更高, 应该这么用: // getActionBar().setDisplayHomeAsUpEnabled(true); }

2.清单文件中指定它的父亲(高版本就不需要写元数据了)

  1. <activity android:name=".DetailActivity" android:label="@string/app_detail" android:parentActivityName="com.itheima.googleplay.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.itheima.googleplay.MainActivity" /> </activity>

实现ActionBar  Tab标签

 1  在Drawable 目录下 写了一个标签的状态选择器(具体查文档)

  1. <!-- 按钮没有按下的状态 --> <!-- 没有焦点的状态 --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected" /> <!-- 有焦点的状态 (例如D-Pad控制或者鼠标经过) --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected_focused" /> <!-- 按钮按下的状态D --> <!-- 没有焦点的状态 --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed" /> <!--有焦点的状态 (例如D-Pad控制或者鼠标经过)--> <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed" /> </selector>

 2  实现自定义主题 (想改的话改图片就行了)

  1. <?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@style/Theme.AppCompat.Light"> //这里会报错,写着只有11以上能能用,可以先在清单文件中改成11,然后在改成低的就不报错了 <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item> <!-- Support library compatibility --> <item name="actionBarTabStyle">@style/MyActionBarTabs</item> </style> <!-- ActionBar tabs styles --> <style name="MyActionBarTabs" parent="@style/Widget.AppCompat.ActionBar.TabView"> <!-- tab indicator --> <item name="android:background">@drawable/actionbar_tab_indicator</item> <!-- Support library compatibility --> <item name="background">@drawable/actionbar_tab_indicator</item> </style> </resources>

 3  在代码里添加标签(删除、隐藏等操作改模式就行)

  1. ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab1=actionBar.newTab().setText("标签一").setTabListener(new MyTabListener());//需要这个接口,可以什么也不写 actionBar.addTab(tab1);

DrawerLayout 

在布局里这样写就行了

  1. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/dl" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <!--如果抽屉没有打开 会显示线性布局 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout> <!-- 左面可以滑出来一个抽屉 --> <!-- <RelativeLayout android:layout_gravity="left" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff0000"> </RelativeLayout> --> <RelativeLayout android:layout_gravity="right" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00"> </RelativeLayout> </android.support.v4.widget.DrawerLayout>   可以一进如程序就打开一个抽泣
  2. drawerLayout=(DrawerLayout) findViewById(R.id.dl); drawerLayout.openDrawer(Gravity.RIGHT);// 打开左面抽屉

ActionBarDrawerToggle  

  控制抽屉的开关, 显示在actionBar 上面 

		ActionBar actionBar = getSupportActionBar();//如果是高版本直接getActionBar
		actionBar.setDisplayHomeAsUpEnabled(true);
		actionBar.setHomeButtonEnabled(true);
            1)显示Navigation Drawer的 Activity 对象
            2) DrawerLayout 对象
            3)一个用来指示Navigation Drawer的 drawable资源
            4)一个用来描述打开Navigation Drawer的文本 (用于支持可访问性)。
            5)一个用来描述关闭Navigation Drawer的文本(用于支持可访问性). 

		drawerToggle = new ActionBarDrawerToggle(this,
				mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer,
				R.string.close_drawer){
					@Override
					public void onDrawerClosed(View drawerView) {
						super.onDrawerClosed(drawerView);
						Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
					}
					@Override
					public void onDrawerOpened(View drawerView) {
						super.onDrawerOpened(drawerView);
						Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
					}
			
			
			
		};
		mDrawerLayout.setDrawerListener(drawerToggle);
		//  让开关和actionbar建立关系 
		drawerToggle.syncState();
		/** 处理actionBar菜单条目的点击事件 */
		public boolean onOptionsItemSelected(MenuItem item) {
			if (item.getItemId() == R.id.action_search) {
				Toast.makeText(getApplicationContext(), "搜索", 0).show();
			}
	
			return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
		}

切换ViewPager 

actionbar的Tab不好看,可以用viewpager里的Tab,只需要嵌套这个PagerTabStrip就可以了

如果的viewpager里是fragment,可以继承FragmentActivity 

  1. <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > <android.support.v4.view.PagerTabStrip //这样viepager上面就有了Tab android:id="@+id/pager_tab_strip“ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:background="#ffffff" android:textColor="#000" android:paddingTop="4dp" android:paddingBottom="4dp" /> </android.support.v4.view.ViewPager> private class MainAdpater extends FragmentStatePagerAdapter{ public MainAdpater(FragmentManager fm) { super(fm); } // 每个条目返回的fragment // 0 @Override public Fragment getItem(int position) { if(position==0){ return new HomeFragment(); }else{ return new AppFragment();//现在先这样写,其余的都显示这个fragment } } // 一共有几个条目 @Override public int getCount() { return 4; } // 返回每个条目的标题 @Override public CharSequence getPageTitle(int position) { return "标签"+position; } } 完整代码请看:2.代码抽取

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang context 包入门

概述 Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope...

36610
来自专栏移动开发的那些事儿

内存泄露的一些坑

如上,在Activity内部如果声明一个这样的Handler,那么myHandler就默认持有Activity引用,假设Activity退出了,但是可能这时候才...

2512
来自专栏葬爱家族

Mvvm、RxJava、Retrofit 三剑合璧

说起现在Android流行的app架构,脱口而出MVP、MVVM,要问两者区别,张口就来,balabalabala。。但是公司所有项目用的都是MVP,从没正式用...

3732
来自专栏向治洪

android自定义属性

1、引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写values/a...

20410
来自专栏青蛙要fly的专栏

项目需求讨论-Vlayout来快速构建及扩展复杂界面

大家好,今天又带来了项目中具体遇到的需求。做一个首界面,该首界面有很多功能块,同时这些功能块是动态的,因为登录的人的权限的不同,会显示不同的功能块,因为功能模块...

2082
来自专栏KK的小酒馆

久闻大名的FragmentAndroid应用界面开发

Fragment(碎片),听名字就知道是一种零部件,确实,这是一种寄生于Activity(活动)之中的灵活型Activity,当然,只是种比喻。

1052
来自专栏Android Note

RecyclerView 刷新闪烁

3757
来自专栏ppjun专栏

Android十八章:5分钟学会用MVP架构开发Android项目

mvp 的思想是把显示和业务逻辑从activity,fragment这些View中分离。让model和view的通信通过Presenter来搞定,这样子就降低了...

962
来自专栏分享达人秀

使用SimpleAdapter

通过ArrayAdapter实现Adapter虽然简单、易用,但ArrayAdapter的功能比较有限,它的每个列表项只能给一个TextView动态填充...

20310
来自专栏向治洪

Android的DataBinding原理介绍

Activity在inflate layout时,通过DataBindingUtil来生成绑定,从代码看,是遍历contentView得到View数组对象,然后...

4378

扫码关注云+社区

领取腾讯云代金券