Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> (Android 基礎(六)) ActionBar

(Android 基礎(六)) ActionBar

編輯:關於Android編程

介紹

Action Bar是一種新増的導航欄功能,在Android 3.0之後加入到系統的API當中,它標識了用戶當前操作界面的位置,並提供了額外的用戶動作、界面導航等功能。使用ActionBar的好處是,它可以給提供一種全局統一的UI界面,使得用戶在使用任何一款軟件時都懂得該如何操作,並且ActionBar還可以自動適應各種不同大小的屏幕。下面是一張使用ActionBar的界面截圖:

這裡寫圖片描述

其中,[1]是ActionBar的圖標,[2]是兩個action按鈕,[3]是overflow按鈕。

基本使用

添加ActionBar


–布局文件–
AndroidStudio自動創建的MainActivity繼承自AppCompatActivity本身攜帶有ActionBar,這裡想要使用ToolBar來實現ActionBar的功能,需要先修改下theme

    

使用Theme.AppCompat.Light.NoActionBar作為activity的風格,這裡插述一下相關屬性代表的界面位置

這裡寫圖片描述

創建ToolBar對應的xml文件
toolbar.xml




這裡把這個文件單獨作為一個xml方便多個layout中包含

activity_main.xml




    
    

主界面對應的layout中include剛才創建的toolbar.xml文件

main_menu.xml


menu 對應的屬性解釋一下

屬性值 意義 id 控件id title 標題(必需) icon 圖標 showAsAction 控制顯示到actionbar還是overflow actionViewClass 構建視圖所使用的View actionProviderClass 基本同上 menuCategory 同種菜單項的種類。該屬性可取4個值:container、system、secondary和alternative。通過menuCategroy屬性可以控制菜單項的位置。例如將屬性設為system,表示該菜單項是系統菜單,應放在其他種類菜單項的後面。 orderInCategory 同種類菜單的排列順序。該屬性需要設置一個整數值,越小越靠左

showAsAction的幾個屬性,解釋一下

屬性 意義 ifRoom 根據當前的空間大小調整 never 永遠不會顯示。只會在溢出列表中顯示,而且只顯示標題,所以在定義item的時候,最好把標題都帶上 always 無論是否溢出,都會顯示 withText withText值示意Action bar要顯示文本標題。Action bar會盡可能的顯示這個標題,但是,如果圖標有效並且受到Action bar空間的限制,文本標題有可能顯示不全。 collapseActionView 聲明了這個操作視窗應該被折疊到一個按鈕中,當用戶選擇這個按鈕時,這個操作視窗展開。否則,這個操作視窗在默認的情況下是可見的,並且即便在用於不適用的時候,也要占據操作欄的有效空間。一般要配合ifRoom一起使用才會有效果。

–代碼使用–

package mraz.com.actionbardemo;

import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    LinearLayout rootlayout;

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

        rootlayout = (LinearLayout) findViewById(R.id.rootlayout);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_menu_black_24dp);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_info:
                Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
                break;
            case R.id.action_search:
                Snackbar.make(rootlayout, " Search ", Snackbar.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Snackbar.make(rootlayout, " Settings ", Snackbar.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

比較關鍵的只有3行代碼

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //獲取toolbar
setSupportActionBar(toolbar); //設置成ActionBar
getMenuInflater().inflate(R.menu.main_menu, menu); //創建actionbar的菜單項

有了這些代碼基本上就可以顯示ActionBar,當然要實現與用戶的交互,就需要對每一個item做對應的響應處理,這裡根據菜單的id,做了簡單的Snackbar的展示,開發者可以根據自己的需要實現更復雜的邏輯

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_info:
                Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
                break;
                ……
    }

–效果圖–
這裡寫圖片描述


使用Action View

上面的例子中有個比較特殊的Menu Item

    

這裡使用了actionViewClass,這個要設置shwoAsAction為 ifRoom|collapseActionView使用才行,其實刪除collapseActionView,也是可以正常使用,只是體現的方式不一樣。獲取SearchView的方式

MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();

SerachView 對象拿到之後可以對其屬性進行操作。給Action View添加展開和收起的事件監聽,實現方式

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        MenuItem searchitem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchitem.getActionView();
        MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Snackbar.make(rootlayout, " onMenuItemActionExpand ", Snackbar.LENGTH_SHORT).show();
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Snackbar.make(rootlayout, " onMenuItemActionCollapse ", Snackbar.LENGTH_SHORT).show();
                return true;
            }
        });
        return true;
    }

拿到searchItem之後,執行
MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() );

–效果圖–
這裡寫圖片描述


使用ActionProviderClass

menu文件中使用

類似的方式獲取ActionProvider

MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)
                MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(……);

針對ActionProvider可以實現自定義的ActionProvider,繼承基礎類ActionProvider


ActionBar導航

啟用ActionBar圖標導航的功能,可以允許用戶根據當前應用的位置來在不同界面之間切換。比如,A界面展示了一個列表,點擊某一項之後進入了B界面,這時B界面就應該啟用ActionBar圖標導航功能,這樣就可以回到A界面。
我們可以通過調用setDisplayHomeAsUpEnabled()方法來啟用ActionBar圖標導航功能

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

此時ActionBar左側會出現一個返回的按鈕
這裡寫圖片描述

針對這返回按鈕的事件響應還是在public boolean onOptionsItemSelected(MenuItem item) 方法中實現,它有一個固定的資源Id—- android.R.id.home<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> case android.R.id.home: finish(); break;

簡單的執行下和返回鍵相同的操作。結束當前activity

實現Activity之間的快速切換
新建一個ParentActivity.java

package mraz.com.actionbardemo;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ParentActivity extends AppCompatActivity {

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

        final Context mContext = this;
        TextView textView = (TextView) findViewById(R.id.tv_parent);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(mContext , MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

AndroidManifest.xml文件中做如下修改


    
        

            
                

                
            
        

        
        

    

這一句很關鍵
android:parentActivityName=”mraz.com.actionbardemo.ParentActivity”>
設置父Activity的名稱,ParentActivity為啟動Activity同時是MainActivity的父Activity
然後在MainActivity中針對這個返回按鈕做一下處理,不再是簡單的結束掉當前的這個Activity了,需要做出對應的導航的處理邏輯

 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);
         }
     break;

其中,調用NavUtils.getParentActivityIntent()方法可以獲取到跳轉至父Activity的Intent,然後如果父Activity和當前Activity是在同一個Task中的,則直接調用navigateUpTo()方法進行跳轉,如果不是在同一個Task中的,則需要借助TaskStackBuilder來創建一個新的Task。
這樣,就按照標准的規范成功實現ActionBar導航的功能了。

–效果圖–

這裡寫圖片描述

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