Android ActionBar

Actionbar

ActiongbarAPIandroid3.0之后首次引入,但也可以添加支持库之后在android2.1之上运行。

Caution: Be certain you import the ActionBar class (and related APIs) from the appropriate package:

  • If supporting API levels lower than 11:
    import android.support.v7.app.ActionBar
  • If supporting only API level 11 and higher:
    import android.app.ActionBar

1、添加actionbar

Android 2.1 (API level 7) 以上

  1. Create your activity by extending ActionBarActivity.
  2. Use (or extend) one of the Theme.AppCompat themes for your activity. For example:
    <activity android:theme="@style/Theme.AppCompat.Light" ... >

Android 3.0 (API level 11)以上

The action bar is included in all activities that use the Theme.Holo theme (or one of its descendants), which is the default theme when either the targetSdkVersion or minSdkVersion attribute is set to "11" or higher. If you don't want the action bar for an activity, set the activity theme toTheme.Holo.NoActionBar.

2、移除Actionbar

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

Get the ActionBar with thegetActionBar() method.

 注:然后可以用show()方法再显示ActionBar.

         隐藏或者移除ActionBar会引起activity重布局,来重填充actionbar所占的空间。如果经常需要隐藏和显示action bar 的话,那就开启重叠模式,即悬浮在activity之上,怎么设置悬浮,在本文下面将有介绍。

3、自定义ActionBar的LOGO

默认会显示<application>或者<activity>元素的icon属性,但是,如果定义了logo属性,ActionBar会使用logo属性的图片。

4、添加ActionBar的Action Items

直接显示在Action Bar上的图标或文字,被称为action buttons;

那些不怎么重要或者不适合放在ActionBar上直接显示的Actions就隐藏在action overflow中吧。

用户按右边的overflow按钮可以展开一个显示其他actions的列表。(如果设置了,也可以按设备的Menu按钮展开overflow)

activity启动时,系统会调用onCreateOptionsMenu()方法来填充action items。同时,用这个方法加载action item布局资源文件。

注:Activity启动时,执行顺序:onCreate-->onStart-->onResume-->onCreateOptionsMenu

如:

res/menu/main_activity_actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@+id/action_search" 
          android:icon="@drawable/ic_action_search" 
          android:title="@string/action_search"/> 
    <item android:id="@+id/action_compose" 
          android:icon="@drawable/ic_action_compose" 
          android:title="@string/action_compose" /> 
</menu>
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu items for use in the action bar 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_activity_actions, menu); 
    return super.onCreateOptionsMenu(menu); 
}

在actionBar中直接显示的Action Button,为了使其根据空间大小自动选择显示或隐藏,需将item标签的showAsAction属性设置为ifRoom。

如:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
    <item android:id="@+id/action_search" 
          android:icon="@drawable/ic_action_search" 
          android:title="@string/action_search" 
          yourapp:showAsAction="ifRoom"  /> 
    ... 
</menu>

上面这个例子,item中既有icon又有title,默认情况下,只显示icon,如果想同时显示icon和title那就这样设置:

<item yourapp:showAsAction="ifRoom|withText" ... />

但是如果显示空间受限,也会不显示text。

我们呢,应该为每一个item设置title属性,即便不声明显示title,因为有些情况会选择显示title而不显示icon。

①actionbar空间不足,将item并入overflow,那么action item只显示title;

②方便视力不好的人阅读;(觉得有点have a joke)

③用户可以长按图标,然后系统会弹出提示条显示title;

 icon是可选的,但是推荐使用。

5、处理action items点击

用户按下一个action时,系统会调用对应activity的onOptionsItemSeleted(MenuItem item)方法。通过MenuItem的getItemId()方法辨别action。

 如果是从fragment中的onCreateOptionsMenu()方法加载item布局,系统会先调用其Activity的onOptionsItemSelected()方法,然后调用fragment的onOptionsItemSelected()方法。

那么怎么让activity放过,让fragment处理呢?那就在onCreateOptionsMenu()方法中返回父类的默认方法,而不是返回false。这样就可以放过了。

如果希望点左上角icon执行返回,根据哪个id判别呢?对于actionbar来说,它的id为android.R.id.home。其他按钮的id都在onCreateOptionsMenu()方法中的布局文件中声明。

6、使用split action bar

Android ActionBar_第1张图片

Split action bar在屏幕底部提供一个分离的bar。

怎么分离呢?

若果API在14以上,那么就简单的在activity或者application标签中添加uiOptions="splitActionBarWhenNarrow"

那要是版本低的话,那就需要在activity标签中添加一个<meta-data>元素。如:

For example:

<manifest ...> 
    <activity uiOptions="splitActionBarWhenNarrow" ... > 
        <meta-data android:name="android.support.UI_OPTIONS" 
                   android:value="splitActionBarWhenNarrow" /> 
    </activity> 
</manifest>

上图中第三张图,移除了icon和title,为达到这个效果,需要这样设置:

setDisplayShowHomeEnabled(false) andsetDisplayShowTitleEnabled(false).

7、appicon返回上层

向上导航跟系统的返回按钮不一样,返回按钮是 简单的返回前一界面;向上导航是 层次结构上返回。

怎么让icon成为一个 向上导航按钮呢?调用 setDisplayHomeAsUpEnabled().例如:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 
 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    ... 
}

这样action bar中的icon就出现了向上的标识,

但默认不关联任何事件,要想关联上打开指定activity,有以下两种实现方式:

①在manifest文件中指定父activity。

如果父activity总是一样的,那么这种方法是最好的选择。parentActivityName属性在API16以上才能使用。低版本需要加<meta-data>标签。

方法如下:

<application ... > 
    ... 
    <!-- The main/home activity (has no parent activity) --> 
    <activity 
        android:name="com.example.myfirstapp.MainActivity" ...> 
        ... 
    </activity> 
    <!-- A child of the main activity --> 
    <activity 
        android:name="com.example.myfirstapp.DisplayMessageActivity" 
        android:label="@string/title_activity_display_message" 
        android:parentActivityName="com.example.myfirstapp.MainActivity" > 
        <!-- Parent activity meta-data to support API level 7+ --> 
        <meta-data 
            android:name="android.support.PARENT_ACTIVITY" 
            android:value="com.example.myfirstapp.MainActivity" /> 
    </activity> 
</application>

一旦像这样在manifest文件中指定父activity 并且 调用setDisplayHomeAsUpEnabled()激活Up按钮。这就可以了。

②在activity中重写 getSupportParentActivityIntent() 和onCreateSupportNavigateUpTaskStack()两个方法。

这种方法适合父activity根据用户如何到达当前界面而异的情况,也就是说,有多种方式能到达当前页,Up按钮应该返回到正确的界面。

这两个方法怎么实现呢?

 在下一篇文章说明。

8、添加一个action view

Android ActionBar_第2张图片

 声明action view有两种方式:

①使用actionLayout属性,指定一个布局资源。

②使用actionViewClass属性,指定一个部件。

如:

add the SearchView widget:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" > 
    <item android:id="@+id/action_search" 
          android:title="@string/action_search" 
          android:icon="@drawable/ic_action_search" 
          yourapp:showAsAction="ifRoom|collapseActionView" 
          yourapp:actionViewClass="android.support.v7.widget.SearchView" /> 
</menu>

如果需要配置action view,比如添加一个事件监听器,那么可以在onCreateOptionsMenu()方法中操作,

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main_activity_actions, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    // Configure the search info and add any event listeners 
    ... 
    return super.onCreateOptionsMenu(menu); 
}

如果API11以上,那么MenuItemCompat.getActionView方法,改成getActionView方法即可。

你可能感兴趣的:(Android ActionBar)