Android ActionBar理解
Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户
当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它
可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且
ActionBar还可以自动适应各种不同大小的屏幕。
actionbar包涵如下区域:
1.App icon 应用的图标,左侧带应用相当于back返回键
2.ViewControl
3.Action button 相当于普通的Button可以监听点击事件
4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button
一 添加和移除Action Bar
1 添加ActionBar:
在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类,
ActionBar默认都是显示出来的。
2 移除ActionBar:
移除的方式有两种
a:将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题
b:在Activity中调用以下方法
ActionBar actionBar = getActionBar();
actionBar.hide();
二 修改Action Bar的图标和标题
修改方式有两种 :
a 在AndroidManifest.xml中修改,如下:
<activity
android:name="com.example.actionbartest.MainActivity"
android:label="今天"
android:logo="@drawable/weather" >
</activity>
*默认情况下,系统使用的是label和icon
b: 在代码中修改
ActionBar actionBar = getActionBar();
ActionBar .setIcon(getResources().getDrawable(R.drawable.ic_launcher));
或ActionBar.setLogo(getResources().getDrawable(R.drawable.ic_launcher));
ActionBar .setTitle("jiantian");
三 添加Action Button并添加点击事件
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的
Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源
文件里面就可以了。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
main.xml
<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="com.example.testprogram.MainActivity" >
<item
android:id="@+id/action_btn_record"
android:showAsAction="always"
android:title="@string/action_title_record"/>
<item
android:id="@+id/action_btn_more"
android:showAsAction="ifRoom"
android:title="@string/action_title_more">
<menu>
<item
android:id="@+id/action_btn_test1"
android:showAsAction="never"
android:title="test1"
/>
<item
android:id="@+id/test2"
android:showAsAction="never"
android:title="test2"
/>
<item
android:id="@+id/test3"
android:showAsAction="never"
android:title="test3"
/>
</menu>
</item>
</menu>
<item>标签中有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,
title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),
showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在
ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar
中,不够的话就显示在overflow中,never则表示永远显示在overflow中。
但出即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性,原因是:
当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,
该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内
容。
当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法
传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别
出用户点击的是哪一个Action按钮,如
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_btn_record:
Toast.makeText(this, "record", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_btn_more:
Toast.makeText(this, "more", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_btn_test1:
Toast.makeText(this, "test1", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
四 添加Action View
ActionView是可以在ActionBar中替换Action Button的控件,最常见的就是SeachView
下面给ActionBar中添加一个SeachView
<item
android:id="@+id/action_btn_search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="always"
android:title="@string/action_title_search"/>
如果你还希望在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只
需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_btn_search);
SearchView searchView = (SearchView) searchItem.getActionView();
//关于SearchView的用发这里不研究
return super.onCreateOptionsMenu(menu);
}
如果程序希望在ActionView展开和合并的时候显示不同的界面,我们只需要去注册一个ActionView
的监听器就能实现这样的功能,代码如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
五 开启ActionBar的导航功能
1 通过Action Bar图标进行导航
a :当从一个activity跳转到另一个activity时,我们可以在目的activity调用
setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能
在ActionBar的icon位置会出现一个向左的箭头,通常情况下这都表示返回的意思,因此
最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
}
在这里ActionBar导航和Back键的功能貌似是一样的,但是是有区别的:
标准的ActionBar导航功能是如下实现的
1 在新打开的目的activity中调用setDisplayHomeAsUpEnabled()方法,并传入true。
2 需要在AndroidManifest.xml中配置父具体的Activity,如下所示
3 对android.R.id.home这个事件进行一些特殊处理,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
}
那么区别在哪呢?其实 ActionBar导航回退到他的父activity,即配置文件中的,二back键回退到
的activity是同栈中的activity。
2 ActionBar的tab导航,下面是一个tab导航的例子,比较简单
package com.example.testprogram.actionbar;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.example.testprogram.R;
/**
* ActionBar的tab导航模式
* @author lufeng
*
*/
public class TestActionBarTableActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactionbar);
ActionBar bar=getActionBar();
//设置模式
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//添加tab
addTab(bar);
}
private ActionBar addTab(ActionBar bar){
bar.addTab(bar.newTab()
.setText("table1")
.setTabListener(new TabListener(new TabContentFragment
("table1"))));
bar.addTab(bar.newTab()
.setText("table2")
.setTabListener(new TabListener(new TabContentFragment
("table2"))));
bar.addTab(bar.newTab()
.setText("table3")
.setTabListener(new TabListener(new TabContentFragment
("table3"))));
bar.addTab(bar.newTab()
.setText("table4")
.setTabListener(new TabListener(new TabContentFragment
("table4"))));
return bar;
}
//ActionBar.TabListener的实现类
private class TabListener implements ActionBar.TabListener {
//fragment
private TabContentFragment mFragment;
public TabListener(TabContentFragment fragment) {
mFragment = fragment;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.fragment_content, mFragment, mFragment.getText());
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(mFragment);
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
Toast.makeText(TestActionBarTableActivity.this, "Reselected!",
Toast.LENGTH_SHORT).show();
}
}
private class TabContentFragment extends Fragment {
private String mText;
public TabContentFragment(String text) {
mText = text;
}
public String getText() {
return mText;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.action_bar_tab_content,
container, false);
return fragView;
}
}
Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户
当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它
可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且
ActionBar还可以自动适应各种不同大小的屏幕。
actionbar包涵如下区域:
1.App icon 应用的图标,左侧带应用相当于back返回键
2.ViewControl
3.Action button 相当于普通的Button可以监听点击事件
4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button
一 添加和移除Action Bar
1 添加ActionBar:
在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类,
ActionBar默认都是显示出来的。
2 移除ActionBar:
移除的方式有两种
a:将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题
b:在Activity中调用以下方法
ActionBar actionBar = getActionBar();
actionBar.hide();
二 修改Action Bar的图标和标题
修改方式有两种 :
a 在AndroidManifest.xml中修改,如下:
<activity
android:name="com.example.actionbartest.MainActivity"
android:label="今天"
android:logo="@drawable/weather" >
</activity>
*默认情况下,系统使用的是label和icon
b: 在代码中修改
ActionBar actionBar = getActionBar();
ActionBar .setIcon(getResources().getDrawable(R.drawable.ic_launcher));
或ActionBar.setLogo(getResources().getDrawable(R.drawable.ic_launcher));
ActionBar .setTitle("jiantian");
三 添加Action Button并添加点击事件
当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的
Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源
文件里面就可以了。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
main.xml
<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="com.example.testprogram.MainActivity" >
<item
android:id="@+id/action_btn_record"
android:showAsAction="always"
android:title="@string/action_title_record"/>
<item
android:id="@+id/action_btn_more"
android:showAsAction="ifRoom"
android:title="@string/action_title_more">
<menu>
<item
android:id="@+id/action_btn_test1"
android:showAsAction="never"
android:title="test1"
/>
<item
android:id="@+id/test2"
android:showAsAction="never"
android:title="test2"
/>
<item
android:id="@+id/test3"
android:showAsAction="never"
android:title="test3"
/>
</menu>
</item>
</menu>
<item>标签中有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,
title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),
showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在
ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar
中,不够的话就显示在overflow中,never则表示永远显示在overflow中。
但出即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性,原因是:
当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,
该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内
容。
当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法
传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别
出用户点击的是哪一个Action按钮,如
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_btn_record:
Toast.makeText(this, "record", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_btn_more:
Toast.makeText(this, "more", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_btn_test1:
Toast.makeText(this, "test1", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
四 添加Action View
ActionView是可以在ActionBar中替换Action Button的控件,最常见的就是SeachView
下面给ActionBar中添加一个SeachView
<item
android:id="@+id/action_btn_search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="always"
android:title="@string/action_title_search"/>
如果你还希望在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只
需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_btn_search);
SearchView searchView = (SearchView) searchItem.getActionView();
//关于SearchView的用发这里不研究
return super.onCreateOptionsMenu(menu);
}
如果程序希望在ActionView展开和合并的时候显示不同的界面,我们只需要去注册一个ActionView
的监听器就能实现这样的功能,代码如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
五 开启ActionBar的导航功能
1 通过Action Bar图标进行导航
a :当从一个activity跳转到另一个activity时,我们可以在目的activity调用
setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能
在ActionBar的icon位置会出现一个向左的箭头,通常情况下这都表示返回的意思,因此
最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
}
在这里ActionBar导航和Back键的功能貌似是一样的,但是是有区别的:
标准的ActionBar导航功能是如下实现的
1 在新打开的目的activity中调用setDisplayHomeAsUpEnabled()方法,并传入true。
2 需要在AndroidManifest.xml中配置父具体的Activity,如下所示
3 对android.R.id.home这个事件进行一些特殊处理,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
}
那么区别在哪呢?其实 ActionBar导航回退到他的父activity,即配置文件中的,二back键回退到
的activity是同栈中的activity。
2 ActionBar的tab导航,下面是一个tab导航的例子,比较简单
package com.example.testprogram.actionbar;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.example.testprogram.R;
/**
* ActionBar的tab导航模式
* @author lufeng
*
*/
public class TestActionBarTableActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactionbar);
ActionBar bar=getActionBar();
//设置模式
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//添加tab
addTab(bar);
}
private ActionBar addTab(ActionBar bar){
bar.addTab(bar.newTab()
.setText("table1")
.setTabListener(new TabListener(new TabContentFragment
("table1"))));
bar.addTab(bar.newTab()
.setText("table2")
.setTabListener(new TabListener(new TabContentFragment
("table2"))));
bar.addTab(bar.newTab()
.setText("table3")
.setTabListener(new TabListener(new TabContentFragment
("table3"))));
bar.addTab(bar.newTab()
.setText("table4")
.setTabListener(new TabListener(new TabContentFragment
("table4"))));
return bar;
}
//ActionBar.TabListener的实现类
private class TabListener implements ActionBar.TabListener {
//fragment
private TabContentFragment mFragment;
public TabListener(TabContentFragment fragment) {
mFragment = fragment;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.fragment_content, mFragment, mFragment.getText());
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(mFragment);
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
Toast.makeText(TestActionBarTableActivity.this, "Reselected!",
Toast.LENGTH_SHORT).show();
}
}
private class TabContentFragment extends Fragment {
private String mText;
public TabContentFragment(String text) {
mText = text;
}
public String getText() {
return mText;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.action_bar_tab_content,
container, false);
return fragView;
}
}
}
还有一些没有记录到的,向list模式的导航,自定义actionbar等,后续有时间在进行更新