Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> ActionBar擴展

ActionBar擴展

編輯:關於Android編程

AcrionBar可以包含基本的按鈕以及抽屜圖標來展示導航抽屜,我們將要了解怎樣使用AppCompatActivity 來支持所有的android版本和一些有力的可擴展的ActionBar特征:
- 使用拆分的action bar 來獲得一個頂部個底部的菜單
- 增加ActionView(app:action_layout)和SearchView 組件
- 配置圖標的順序
- 使用ActionProviderShareActionProvider 來獲得豐富的作用。
- 配置home圖標來向上導航
- 在ActionBar中從碎片中轉換菜單圖標

建立AppCompatActivity

讓你的活動繼承AppCompatActivity來獲得良好的兼容性以及改變主題使其更加兼容例如Theme.AppCompat.Light.DarkActionBar


    

現在ActionBar已經配置完成,但是我們還要在menu菜單中加入app:showAsAction = "ifRoom" 這可以增加我們對於增加項的支持。

填充動作按鈕

action bar為用戶提供了進入當前頁面最重要的動作項的權限,像之前一樣重寫onCreateOptionMenu 加載相應的菜單布局。

配置ActionBar圖標的順序

使用orderinCategory 來為每一項指定一個整數,越小的整數優先權越高android:orderInCategory = "20"

自定義風格

通過創建自己的ActionBar主題風格來配置風格和相關屬性。



    
    #ECD078
    #53777A

然後應用主題


自定義布局

我們可以用我們自己的XML文件替換自動的標題。


    

然後在代碼中 getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);//展示自定義的view getSupportActionBar().setCustomView(R.layout.actionbar_title);
如果想要在自定義的布局中展示圖標的話需要附加一個值getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME)
我們仍然可以重寫onCreateOptionMenu 來添加自定義的動作按鈕。

添加ActionView項

如果想要添加一個不只是簡單的圖標或者是文本的項,例如一個交互功能更加強的控件,一個Actionview可以讓你這樣做,常見的是SearchView 平時是一個折疊的搜索圖標,然後展開顯示一個EditText 文本,首先我們需要創建一個布局文件作為ActionView以便以後可以嵌入到ActionBar中。

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    

我們可以將此布局文件可以加載到任何一項通過制定app:action_layout 屬性



	 

我們可以通過重寫onPrepareOprionsMenu 來獲得ActionView的引用

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem actionViewItem = menu.findItem(R.id.miActionButton);
        // Retrieve the action-view from menu
    View v = MenuItemCompat.getActionView(actionViewItem);
        // Find the button within action-view
    Button b = (Button) v.findViewById(R.id.btnCustomAction);
    // Handle button click here
    return super.onPrepareOptionsMenu(menu);
}

使用SearchView

首先我們在menu文件中加入SearchView



	 

collapseActionView 表明平時將actionview折疊成圖標,點擊展開
現在我們需要在搜索時添加一個監聽器:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
       @Override
       public boolean onQueryTextSubmit(String query) {
            // perform query here

            // workaround to avoid issues with some emulators and keyboard devices firing twice if a keyboard enter is used
            // see https://code.google.com/p/android/issues/detail?id=24599
            searchView.clearFocus();

            return true;
       }

       @Override
       public boolean onQueryTextChange(String newText) {
           return false;
       }
   });
   return super.onCreateOptionsMenu(menu);
}

自定義圖標和文本顏色:

MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    // Use a custom search icon for the SearchView in AppBar
    int searchImgId = android.support.v7.appcompat.R.id.search_button; 
    ImageView v = (ImageView) searchView.findViewById(searchImgId);
    v.setImageResource(R.drawable.search_btn);
    // Customize searchview text and hint colors
    int searchEditId = android.support.v7.appcompat.R.id.search_src_text;
    EditText et = (EditText) searchView.findViewById(searchEditId);
    et.setTextColor(Color.BLACK);
    et.setHintTextColor(Color.BLACK);
}

使用圖標向上導航

使用setDisplayHomenAsUpEnabled 方法,Up 相對於返回鍵是帶領用戶返回邏輯上的屏幕,這不是基於導航的歷史而是屏幕之間的關系,例如在郵件客戶端返回鍵可能會帶領用戶回到之前的郵件,而up 會一直將用戶帶回郵件列表。
首先我們指定home用作up

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

}

我們也可以明確的重寫up按鈕,通過檢查android.R.id.home id是否被選擇

@Override
  public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
      // This is the up button
      case android.R.id.home:
          NavUtils.navigateUpFromSameTask(this);
          // overridePendingTransition(R.animator.anim_left, R.animator.anim_right);
          return true;
      default:
          return super.onOptionsItemSelected(item);
      }
  }

這樣的話允許我們配置up鍵按下時的過度效果。

編譯時的配置

為了指定up 導向的上一個活動,我們可以在AndroidManifest.xml 文件中設置邏輯上的父項。


        
        

現在每當home圖標按下都會導航到父活動,如果你想父活動保持他的狀態可以為父活動指定狀態為android:launchMode:"SingleTop" 當棧頂活動為父活動時不會在創建新的活動。

運行時配置

如果我們想動態設置up 鍵而不想在注冊文件中的話,我們可以重寫getSupportParentActivityIntent() 方法返回想要的基於傳入的參數的intent。

public static final String PACKAGE_NAME = "com.myapplication.";
public static final String PARENT_NAME_EXTRA = "ParentClassName";

@Override
public Intent getSupportParentActivityIntent() {
    //獲得父類的intent
    Intent parentIntent = getIntent();
    String className = parentIntent.getStringExtra(PARENT_NAME_EXTRA);
    // 基於父類名稱創造一個意圖
    Intent newIntent = null;
    try {
         //使用包名定義類
         newIntent = new Intent(this, Class.forName(PACKAGE_NAME + className));
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    // 隨著`up`活動返回intent
    return newIntent;
}

然後當我們想要啟動新的活動時候,我們需要應用ParentClassNmae 作為父類額外的控制

Intent intent = new Intent(this, ChildActivity.class);
intent.putExtra(ChildActivity.PARENT_NAME|_EXTRA, "PrentActivity");
startActivity(intent);

從碎片配置ActionBar

從碎片中配置actionbar和從活動中非常的相似,但是有點區別。
自動的,android嘉定碎片不想想actionbar提供items,當一個碎片確實想要向actionbar添加項時,需要告知安卓系統,setHasOptionMenu(true) 在onCreate()方法中

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ...

    setHasOptionsMenu(true);
}

現在安卓會調用onCreateOptionsMenu(..) 和相關的方法
要記住任何由碎片添加的items將會衣服在任何現存的items上,包括了由所包含的活動添加的項,你可以使用orderInCategory 來控制順序。
與活動中相似,在碎片中安卓提供了一個MenuInflater:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.my_menu, menu);
}

處理點擊事件也和活動中相同,不同之處在於碎片的onOptionItemSelected(...) 方法只在活動中的此方法不處理點擊事件時才會被調用

@Override
public boolean onOptionItemSelected(MenuItem item) {
    //處理選項
    switch (item.getItemId()) {
        case R.id.my_item:
        //處理點擊
            return true;
        default: 
            return super.onOptionItemSelected(item);
    }
}

配置Split-Action Bar

。。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved