您的位置:首页 > 其它

ActionBar

2015-09-23 16:25 225 查看
一:什么是ActionBar

 名为:动作栏。它是一种窗口特性,可以定义使用位置,提供给使用所要执行的动作以及导航模式。它可以自适应不同屏幕。



二:怎么添加ActionBar

1.从android3.0(API级别)开始

当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值。

默认的主题是Theme.Hole,Action bar被包含在这个主题中

注意:    如果你想使用ActionBar API来进行添加导航模式和修改操作栏样式的操作,你应该把minSdkVersion属性设置为“11”或更大的值。

2.Android 3.0以前使用(需要引入appcompat v7 Support Library)

三:ActionBar的主题

1.主题为Theme.Holo,在androidManifest.xml中,Activity标签下使用,比如

<activity android:name=".HoloActivity"
android:theme="@android:style/Theme.Holo"
/>


</pre><p>2.常用主题</p><p>@android:style/Theme.Holo.NoActionBar:无动作栏</p><p>@android:style/Theme.Holo.Light:灰色动作栏</p><p>@android:style/Theme.Holo.DarkActionBar:默认主题,为黑色</p><p>3.使用logo</p><p>logo主要为app厂商的logo,在AndroidManifest.xml文件activity标签下添加,比如:</p><pre name="code" class="html"><activity android:name="com.example.actionbardemo1.LightActivity"
android:theme="@android:style/Theme.Holo.Light"
android:logo="@drawable/camera"/>
四:ActionBar的显示与隐藏

1.ActionBar的显示与隐藏可以通过hide()方法对ActionBar进行隐藏,再使用show将其显示,比如:

<activity android:name=".HoloActivity"
          android:theme="@android:style/Theme.Holo"

<pre name="code" class="html">ActionBar actionBar = getActionBar();//获取ActionBar
if(actionBar.isShowing()){//判断动作栏是否显示
actionBar.hide();//隐藏
}else{
actionBar.show();//显示
}
/>

2.把Activity的主题设置为Theme.Holo.NoActionBar就可以了

<activity
          android:theme="@android:style/Theme.Holo.NoActionBar"
/>
五:ActionBar的4个区域

     


1.app icon:可以替换为别的logo

2.View Control

    drop-down菜单或tab controls。也可以用来显示非交互的内容,例如app title或更长的品牌信息。

3.action buttons

    盛不下的会自动移动到action overflow中。长按可显示action的名称。action Buttons的总宽度不会超过整个ActionBar宽度的50%。一般小于360dp的屏幕宽度只能放置2个icons,360-499dp的可以放置3个icons,500-599dp可以放4个icons,600dp以上可以放5个icons。

4.action overflow

    把不常用的Actions移到Action overflow 

六:添加动作项

1.所谓动作项就是一个动作按钮,显示在动作栏上,有图标,文字以及点击事件

2.添加动作项:与menu一样,需要在xml中定义,比如:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
/>
<item
android:id="@+id/action_compose"
android:icon="@drawable/ic_action_compose"
android:title="@string/action_compose"
 />
</menu>
3.在Activity中的onCreateOptionsMenu() 导入该xml文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
4.item标签属性

id:表示动作项的id,与menu项一致

icon:显示在动作栏上的动作项图标

title:动作项文本

注意:以上代码在平板上运行时会直接出现列表项,如果是手机设备还需要使用showAsAction属性,比如:

<item
android:id="@+id/action_compose"
android:icon="@drawable/favorite"
android:showAsAction="ifRoom"
android:title="收藏"/>
注意:title默认情况不会显示在ActionBar上,但必须定义,原因:

(1)当动作项没有全部显示时,那些没显示的动作项会隐藏到overflow中,点击overflow会显示一个下拉列表,该列表会显示动作项的title

(2)对于视障用户,可能看不懂图标的意思,而可以通过title理解图标的功能

(3)当用户长按动作项时会弹出title的Toast,起到提示作用

5.showAsAction的属性:

①never:不显示在ActionBar中,对于有menu按键的手机设备,可以点击menu按键进行查看

②ifRoom:当ActionBar有空间时显示动作项,如果没有则不显示,对于有menu按键的手机设备,可以点击menu按键进行查看

③always:一直显示在ActionBar上

④withText:显示图标的同时还要显示title文本

⑤collapseActionView:折叠效果

6.处理动作项点击事件

与menu的点击事件一样,可以通过onOptionsItemSelected() 方法处理点击事件,比如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_compose:
composeMessage();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
7.拆分动作栏

当一个狭窄的屏幕(比如纵向的手机屏幕)显示过多的ActionBar动作项时,需要将其分开显示,如图:

                          


实现:在AndroidManifest.xml的activity标签下,使用uiOptions属性,对于老版本还需要添加meta-data标签,例如:

<manifest ...>
<activity
uiOptions="splitActionBarWhenNarrow" ...
>
<meta-data
android:name="android.support.UI_OPTIONS"
android:value="splitActionBarWhenNarrow"
 />
</activity>
</manifest>
8.上级导航按钮

当A界面跳转到B界面时,B界面可以通过上级导航按钮返回A界面

<img src="https://img-blog.csdn.net/20150923192915114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


实现:

①在要添加上级导航按钮的Activity中设置下面两个方法

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);//显示ActionBar尖括号
actionBar.setHomeButtonEnabled(true);  //设置ActionBar主按钮可以点击
②为导航按钮添加点击事件,其id为android.R.id.home(固定的)

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home://ActionBar主按钮的id
Intent intent = new Intent(this,ActionBarDemo4Activity.class);
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
③在AndroidManifest.xml的activity标签下添加父级Activity的路径

<activity
android:name="com.example.actionbardemo4.ScreenB"
android:parentActivityName=".ActionBarDemo4Activity"
></activity>
取消actionbar左侧的快捷图标和文字
getActionBar().setDisplayShowHomeEnabled(false);
getActionBar().setDisplayShowTitleEnabled(false);

七:Action View
1.定义:动作视图类似于一个Action Button,它自己的UI以及点击事件



2.添加Action View的方式

(1)actionViewClass 

使用:

①在Menu的xml文件中设置actionViewClass 属性,值为组件的全路径,比如:

<item android:id="@+id/action_search"

android:title="@string/action_search"
android:icon="@drawable/ic_action_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.support.v7.widget.SearchView"
 />
注意:showAsAction属性中的collapseActionView表示折叠Action View,折叠后会出现一个上级导航按钮

②为Action View添加点击事件

在onCreateOptionsMenu()方法中,找到相应组件,并添加监听事件,如下:

MenuItem searchItem = menu.findItem(R.id.action_settings);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {//提交查询文本时调用
Toast.makeText(getApplicationContext(), "Submit-->" + query,Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {//当输入查询文本时调用此方法,为实时调用
Toast.makeText(getApplicationContext(), "Change-->" + newText,Toast.LENGTH_SHORT).show();
return false;
}
});
(2)actionLayout 

①创建一个布局,该布局将显示在ActionBar上

②在Menu的xml文件中设置actionLayout属性,导入①中创建的布局,如下:

<item
android:id="@+id/action_layout"
android:showAsAction="ifRoom|collapseActionView"
android:icon="@drawable/clock"
android:actionLayout="@layout/actionlayout"
android:title="时间"/>
注意:collapseActionView同actionViewClass方式,也可以进行折叠

③为Action View添加点击事件

MenuItem clockItem = menu.findItem(R.id.action_layout);
View view = clockItem.getActionView();
DigitalClock dc = (DigitalClock) view.findViewById(R.id.digitalClock1);
dc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "ddd",Toast.LENGTH_SHORT).show();
}
});
3.处理折叠响应

使用OnActionExpandListener 监听器,重写两个方法

@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(getApplicationContext(),"<" + item.getTitle() + ">已经展开", Toast.LENGTH_SHORT).show();
return true;// 为false不会展开
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(getApplicationContext(),"<" + item.getTitle() + ">已经折叠", Toast.LENGTH_SHORT).show();
return true;// 为false不会折叠
}
4.在Activity中通过组件(如Button)折叠或展开Action View

①展开:menu.findItem(R.id.action_layout).expandActionView();

②折叠:menu.findItem(R.id.action_layout).collapseActionView();

八:Action Provider(分享)

类似一个Aciton View,有自己的布局和点击事件,可以提供分享功能

                   



实现Provider的两种方式

1.ShareActionProvider(系统自带)

(1)使用:

①在Menu的xml文件中设置actionProviderClass 属性,值为ShareActionProvider的全路径,比如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/action_share"
android:title="@string/share"
android:showAsAction="ifRoom"
android:actionProviderClass="android.widget.ShareActionProvider"
/>
...
</menu>
②在代码中使用setShareIntent()方法,添加分享意图
ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
mShareActionProvider.setShareIntent(intent);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "发送的短信内容");
(2)特点:

当用户点击ShareActionProvider列表,系统将常用的应用放到列表顶部,记录此功能有两种方式

①通过系统默认的xml文件进行保存

②使用setShareHistoryFileName("xxx.xml")方法保存

上述两个文件都属于私有文件,在data/data/路径中

2.自定义Provider

①创建一个类,继承ActionProvider

②重写三个方法:

1)ActionProvider():构造器,传入一个context

2)onCreateActionView():使用 1) 提供的context实例化LayoutInflater,导入自定义的布局,并可以添加点击事件,该视图会显示在ActionBar上

3)onPerformDefaultA
9418
ction():当menu item在overflow上被选中时调用,一般设置一些默认操作

九:Navigation Tabs

定义:导航标签,可与fragment结合实现在一个Activity中显示多界面的效果

          



使用:

1.使用ActionBar对象添加标签

ActionBar actionBar = getActionBar();
//设置导航模式
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar.newTab().setText("MOVIES").setIcon(R.drawable.calendar)
.setTabListener(new MyTabListener()).setTag("1");
actionBar.addTab(tab);
2.实现ActionBar.TabListener监听器

重写方法

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
//当点击标签时触发此方法
...
ft.replace(R.id.main, new FragmentA(),"fragmentA");//切换Fragment
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
//未点击标签时触发此方法
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
//双击标签调用该方法
}

注意:重写方法中的FragmentTransaction ft参数,不能添加回退栈,也不能使用commit()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: