ActionBar
1.ActionBar介绍
Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果。
Action bar的主要目的是:
- 提供一个用于识别应用程序的标示和用户的位置的专用空间。
- 在不同的应用程序之间提供-致的导航和视觉体验。
- 突出Activity的关键操作(如”搜索"、 “创建"、“共享”等),并且在可预见的方法内给用户提供快捷的访问。
获得ActionBar的方法很简单: ActionBar actionBar = this. getActionBar();注意代码中的主题设置是否为去掉ActionBar,否则getActionBar()将返回null。
2.添加删除ActionBar
添加Action Bar:
从Android3.0 (API级别 11)开始,ActionBar被包含在所有的使用Theme.Hole主题的Activity (或者是这些Activity的子类)中,当targetSdkVersion或 minSdkVersion属性被设置为“11"或更大的数值是,这个主题是默认的主题一。
删除Action bar:
如果你不想要Action bar,把Activity的主 题设置为Theme Holo.NoActionBar就可以了或者使用Action bar的hide()方法,如下:
ActionBar actionBar = getActionBar();
actionBar hide();
3.ActionBar菜单
当Activity首次启动时,系统会调用onCreateOptionsMenu()方法给你的Activity组装ActionBar和悬浮菜单。
在menu XML文件中,你能够通过给< item >元素声明android:showAsAction="ifRoom"属性,请求把.一个菜单项作为一个操作项来显示。
<menu xmlns:android-"http://schemas android.com/apk/res/android>
<item android:id=*@+id/menu. save"
android:icon="@drawable/ic_ menu_ save"android:title-"@string/menu_ save"
android:showAsAction-"ifRoomlwithText" />
</menu>
示例:
设置菜单栏选项
<?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">
<item android:id="@+id/action_settins" android:title="Settings"
android:orderInCategory="100" app:showAsAction="never"></item>
<item android:id="@+id/exit" android:title="exit"
android:orderInCategory="200" app:showAsAction="ifRoom|withText"></item>
</menu>
调用菜单栏方法
package com.example.actionbar;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getSupportActionBar();
System.out.println(actionBar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id=item.getItemId();
if (id==R.id.action_settins){
return true;
}
return super.onOptionsItemSelected(item);
}
}
4.ActionBar标题栏
使用分离式操作栏
要启用分离式操作栏,只需简单的在< application >或< activity >元素中添加uiOptions="splitActionBarWhenNarrow"属性设置就可以了。
导航栏使用应用图标
应用程序应该在这个图标上响应以下两个操作之一:
- 返回应用程序的“主"Activity;
- 向应用程序上级页面导航。
当用户触模这个图标时,系统会调用Activity带有android.R.id.home ID的onOptionsltemSelected()方法。
注意:如果你要使用应用图标来返回主页,要注意从Android4.0 (API 级别14)开始,必须通过调用setHomeButtonEnabled(true)方法确保这个图标能够作为一个操作项。
向应用程序上一级页面导航:
应用程序图标能够向上导航,就要在你的ActionBar中调用setDisplayHomeAsUpEnabled(true)方法。
package com.example.actionbar;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
ActionBar actionBar=getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);//使图标可以向上进行返回
}
}
清单文件
<activity
android:name=".Main2Activity"
android:label="@string/title_activity_main2"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
添加操作页面
搜索菜单
在mune.xml文件中添加item
<item android:id="@+id/search" android:title="search"
android:orderInCategory="300" app:showAsAction="ifRoom|withText"
android:icon="@android:drawable/ic_menu_search"
app:actionViewClass="android.support.v7.widget.SearchView"></item>
在onCreateOptionsMenu方法中写入方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
MenuItem searchItem=menu.findItem(R.id.search);
SearchView searchView= (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(getApplicationContext(), query, Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return true;
}
分享菜单
添加item
<item android:id="@+id/share" android:title="share"
android:orderInCategory="400" app:showAsAction="ifRoom"
android:icon="@android:drawable/ic_menu_share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"></item>
在onCreateOptionsMenu方法中写入方法
//分享菜单项
MenuItem shareItem=menu.findItem(R.id.share);
ShareActionProvider shareActionprovider= (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
shareActionprovider.setShareIntent(getDefaultIntent());
设置一个Intent
private Intent getDefaultIntent() {
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
return intent;
}
点击share,会将模拟器上所有可进行分享的方法显示出来
5.ActionBar导航
当你需要在activity中提供导航tab页时,使用action bar的tab页是一个极佳的选择(而不是用TabWidget),因为系统会根据不同的屏幕尺寸对action bar tab进行调整一屏 幕够宽时放入主action bar,屏幕太窄时放入拆分后的bar。
增加tab页的基本步骤如下:
actionBar. setNavigationMode(ActionBar .NAVIGATION MODE TABS);
- 实现ActionBar.TabListener接口。 此接口中的回调方法对tab页中的用户作出响应,使你能切换fragment。
- 针对你要添加的每一个tab页,都要实例化一个ActionBar.Tab并通过调用setTabListener()设置ActionBar.TabListener。还要用setText()和/或setlcon()设置tab页的标题和/或图标。
- 调用addTab()把所有tab页都加入到action bar中去。
package com.example.actionbar;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class Main3Activity extends AppCompatActivity implements ActionBar.TabListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
ActionBar actionBar=getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//设置为导航条模式
actionBar.setDisplayShowTitleEnabled(false);
//添加选项卡
actionBar.addTab(actionBar.newTab().setText("新闻").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("视频").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("音乐").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("游戏").setTabListener(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id=item.getItemId();
if (id==R.id.action_settins){
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
Toast.makeText(this, tab.getText(), Toast.LENGTH_SHORT).show();
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
}