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() )使之有效。

[html] view plaincopy
 
  1. <TextView android:id="@+id/textViewId"    
  2.     android:layout_width="fill_parent"   
  3.     android:layout_height="fill_parent"  
  4.     android:scrollbars="vertical"  
  5.     android:scrollbarStyle="insideOverlay"  
  6.     android:scrollbarSize="25dip"  
  7.     android:scrollbarFadeDuration="0"  
  8.     />  

 

返回主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小例子中下載。

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()