★10.ActionBar

ActionBar

简介

  • 屏幕部的工具栏

设置ActionBar图标和文字

  • 可以在或者中通过android:logo来进行指定图标:
    
    
    

获取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 中:


    

解说

  • 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
    
    
    

第二步

// 效果为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文件



    

代码

// 在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】

  • 教程

你可能感兴趣的:(★10.ActionBar)