ActionBar在Android 3.0 SDK中為平板引入,在4.0中也可以在phone中使用。在title中提供類似tab和菜單的效果,有三種形式:Tabbed action bar,list action bar和standard action bar,我們將在小例子中進行示範。
Home Icon
在Action Bar的最左邊,就是Home icon和標題的區域,如上圖紅圈內。在Home icon的左邊有一個返回的的左箭頭,通常我們點擊這個區域,將回到應用的主activity中。圖中的activity是通過主activity的菜單觸發,之前已經多次使用,不在重複。activity的layout很簡單,只有一個textview在LinearLayout中,其代碼如下:
源代碼
public class HomePressTestCase1 extends Activity{
private TextView tv = null;
private ActionBar bar = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_test);
tv = (TextView)findViewById(R.id.textViewId);
tv.setMovementMethod(ScrollingMovementMethod.getInstance());//設置TextView內容過多時,可以通過鼠標進行滾動
tv.setText("");
//在android 4.0後,缺省是不監聽Home icon動作,要有效使用,必須進行下面的設置
bar = getActionBar(); //獲取ActionBar的對象,從這個方法也可知action bar是activity的一個屬性
bar.setDisplayHomeAsUpEnabled(true); //顯示返回的箭頭,並可通過onOptionsItemSelected()進行監聽,其資源ID為android.R.id.home。
// bar.setHomeButtonEnabled(true); //不顯示箭頭符號,允許通過onOptionsItemSelected()進行箭頭,但一般的情況下,還是應該給個箭頭提示給用戶。
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home: //對用戶按home icon的處理,本例只需關閉activity,就可返回上一activity,即主activity。
showInfo("Home is press");
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
protected void showInfo(String s){
tv.setText(s + "\n" + tv.getText());
Log.d(getLocalClassName(),s);
}
}
TextView的滾動
我們可以將整個layout設置為ScrollView,但是TextView本身可以設置滾動,在xml中相關的屬性如下。並在代碼中通過setMovementMethod(ScrollingMovementMethod.getInstance() )使之有效。
- <TextView android:id="@+id/textViewId"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:scrollbars="vertical"
- android:scrollbarStyle="insideOverlay"
- android:scrollbarSize="25dip"
- android:scrollbarFadeDuration="0"
- />
返回主activity或指定activity
如果上一activity並非主activity,而我們有希望直接返回主activity,可以如下處理:
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
showInfo("Home is pressed");
Intent i = new Intent(this,MainActivity.class);
//【對於FLAG_ACTIVITY_CLEAR_TOP】:假設目前activity的task堆棧是 MainActivity –> A –> B –> 當前Activity(如果我們按返回鍵,則依次返回B,A,最後為MainActivity。現在intent要喚起MainActivity,發現在堆棧存在,則將其及之前的全部清楚,在喚起新的activity後,task堆棧為MainActivity。注意,通過跟蹤activity的對象,將產生一個新的MainActivity的實例,不是原來的,原來的已經被幹掉。又例如當前為C—> M—>A—>B—>當前,如果打開M,則執行後,推展為C—>M。
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
在Android 4.1之後(API Level 16),有更方便的處理方式,在AndroidManifest.xml中設置返回的activity即可,xml的片段如下:
<activity android:name=".HomePressTestCase1" android:label="@string/test_case_1_home"
android:parentActivityName="cn.wei.flowingflying.pro.MainActivity" />
我們只需設置parentActivityName,用戶按Home icon區域,不需要人工代碼進行處理,就可以實現上面通過設置flag的intent代碼的實現。java代碼可進一步簡化:
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == android.R.id.home){
showInfo("Home is press");
}
return super.onOptionsItemSelected(item);
}
本博文涉及的例子代碼,可以在Pro Android學習:ActionBar小例子中下載。