★10.ActionBar

ActionBar

簡介

  • 屏幕部的工具欄

設置ActionBar圖標和文字

  • 可以在<application>或者<activity>中通過android:logo來進行指定圖標:
    <activity
        android:name="com.example.actionbartest.MainActivity"
        android:label="天氣"
        android:logo="@drawable/weather" >
    </activity>
    

獲取ActionBar

ActionBar actionBar = getActionBar();

隱藏ActionBar

ActionBar actionBar = getActionBar();
actionBar.hide();

子標題

ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null){
    actionBar.setSubtitle(/* String */);
}

OptionsMenu

簡介

  • 在工具欄上面顯示的菜單。

簡單示例

XML

代碼

menu_quiz.xml 中:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      tools:context=".QuizActivity">
    <item
            android:id="@+id/action_settings"
            android:title="@string/action_settings"
            android:orderInCategory="100"
            app:showAsAction="never"/>
</menu>

解說

  • tools:context可以使當前布局文件得知Activity的主題,從而便于根據渲染上下文預覽。
  • app:showAsAction
    • never:不顯示。
    • always:顯示。
    • ifRoom|withText:如果空間足夠,顯示圖片及文字;否則,僅顯示圖片,或不顯示隱藏到溢出菜單中。

創建菜單選項代碼

// 在Activity或Fragment中
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_quiz, menu);
    return true;
}

設置菜單子項

// 在onCreateOptionsMenu中
MenuItem menuItem = menu.findItem(R.id.menu_item_1);
menuItem.setTitle(/* String */);

處理菜單選項事件

  • 更新選項菜單的子項時,需要調用invalidateOptionsMenu()通知更新。
    // 在Activity或Fragment中
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_settings:
            // doSomething
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    

選項菜單子項發生變化時

// 通知變化
getActivity().invalidateOptionsMenu();

層級導航

簡介

  • 后退按鈕導航和層級導航(向上按鈕導航)并不一樣。層級導航是開始一個新的Activity,彈出回退棧里此Activity以上的Activity。后退按鈕導航則是彈出回退棧里最頂層的Activity

第一步

  • AndroidManifest.xml 中的Activity里設置android:parentActivityName
    <activity
            android:name=".BActivity"
            android:label="@string/app_name"
            android:parentActivityName=".AActivity">
    </activity>
    

第二步

// 效果為ActionBar圖標左側會出現一個向左的箭頭。
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

第三步

  • 【待驗證】似乎可以省略這一步。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    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);
        }
        return true;
    }
}

ActionView

SearchView

簡單示例

XML文件

<?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">
    <item
            android:id="@+id/menu_item_search"
            android:title="@string/search"
            android:icon="@drawable/ic_search"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom|collapseActionView"/>
</menu>

代碼

// 在Activity或Fragment中
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);
    MenuItem searchItem = menu.findItem(R.id.menu_item_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            /* 完成輸入,點擊搜索 */
            /* do something */

            // 隱藏鍵盤
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), 0);
            searchView.onActionViewCollapsed();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            /* do something */
            return false;
        }
    });

    searchView.setOnSearchClickListener(/* 進入輸入狀態 */);

    return super.onCreateOptionsMenu(menu);
}

示例解說

  • XML 部分:
    • app:actionViewClassActionView可以放在ActionBar上,可以通過定制ActionView實現自己想要的功能。
    • app:showAsActioncollapseActionView可能會導致顯示文字而不是圖標。

ShareActionProvider【Todo】

ActionBar定制【Todo】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容