android4.0 ActionBar API

2023-11-03

ActonBar介绍

     ActionBar取代了传统的标题栏(title),其在activity位置就是title原有的位置,在activity的顶部。ActionBar上默认情况下包括了应用(app)的logo,logo的位置在ActionBar的左侧,紧挨在logo右侧的是activity的标题(title)。在ActionBar的右侧,可以是在选项菜单(options menu)中任意一个菜单项。ActionBar提供若干有用的特性,其中包括了:

① 作为“action选项”,在ActionBar上直接显示“选项菜单”(OptionsMenu)——

为用户进行某项操作提供直接的访问;

   作为“action项”没有出现在ActionBar上得菜单项会被置于“更多...”菜单项

中,在ActionBar上,“更多...”菜单项是以下拉形式实现的。

② 为在多个fragments之间切换提供标签(tabs)功能;

③ 为导航提供下拉列表;

④ 在“action项”位置提供交互式action组件,例如搜索框。

 在Activity中获得ActionBar

    在Android 3.0及更高的版本中,Activity中都默认包含有ActionBar组件。特别要注意的是,所有使用“holographic”主题的Activity都包含有ActionBar,并且所有Android 3.0上的应用自动接收这个主题。一个应用被认为是基于Android 3.0的标识是在AndroidManifest中的<uses-sdk>标签中设置了android:minSdkVersion或者android:targetSdkVersion属性值为11或者更大值时,此时的应用被系统认为是Android 3.0上得应用,这样就默认接受“holographic”主题,即其中的Activity包含有ActionBar。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.helloworld"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4"
              android:targetSdkVersion="11" />
    <application ... >
        ...
    </application>
</manifest>

    在这个例子中应用需求的最小的API版本号是4(Android 1.6),但同时这是了目标API版本是11(Android 3.0)。这样当这个应用程序在运行Android 3.0或者更高版本的设备上运行时,系统会在应用程序的Activity上应用“holographic”主题,这样每个Activity就都包含有ActionBar。

但是如果你想使用ActionBar的API,例如增加标签(tabs)或者改变ActionBar风格,那么你必须设置android:minSdkVersion的值为11,这样你才可以访问到ActionBar类。

取消ActionBar

如果你在某个Activity中不需要ActionBar,那么将Activity的主题设置为Theme.Holo.NoActionBar。例如:

    <activity android:theme="@android:style/Theme.Holo.NoActionBar">

   指导:若果在你不需要ActionBar的Activity中有自定义的Activity主题,那么设置android:windowActionBar风格属性的值为false,有关ActionBar的风格在后面会讨论到。

同样,在运行时调用hide()方法也可以隐藏ActionBar,调用show()方法来显示ActionBar()。例如:

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

当你隐藏ActionBar时,系统会将Activity的整个内容充满整个空间。

注意:如果使用一个主题(theme)来移除Activity上得ActionBar,那么窗口将不再会有ActionBar,因此在运行时也就没有办法来添加ActionBar——调用getActionBar()方法会返回null值。

增加Action Item

一个Action Item实质上仅仅是一个Options Menu菜单项,这个菜单项被声明直接在ActionBar上显示而已。一个Action Item可以包含一个图标,一个文本或者两个兼有。如果一个Acton Item没有出现在ActionBar上,那么系统会将其放置在“更多”菜单中,用户可以通过ActionBar右侧的图标打开“更多”菜单项。

当Activity首次启动时,系统会通过调用onCreateOptionsMenu()方法来将菜单项放置于ActionBar和“更多”菜单当中。就如在Menu开发指导中讲述到的一样,在这个回调方法中,我们为Activity定义选项菜单(Options Menu)。

如果要声明在ActionBar上有空间时才显示一个Action Item的话,你可以在菜单资源(menu resource)的<item>标签中设置android:showAsAction="ifRoom"来将一个菜单项声明为Action Item。这样只有当ActionBar上有空间来显示这个菜单项时,才会显示来直接进行访问(其功能)。如果ActionBar上没有足够的空间,那么Action Item会被放置于“更多”菜单项中(可以通过点击ActionBar右侧图标打开查看到菜单项)。

同样也可以通过在应用的代码中声明一个Action Item。通过调用MenuItem对象的setShowAsAction()方法,并传入SHOW_AS_ACTION_IF_ROOM参数值。

如果菜单项(options menu)包含了图标和文本,而默认情况下,Action Item只显示图标。如果你想在Action Item上同时也显示文本,需要添加“with text”标识位。在XML中,在android:showAsAction属性值上添加“withText”属性值,或者在代码中调用setShowAsAction()方法是传入SHOW_AS_ACTION_WITH_TEXT参数值。图2中显示的是ActionBar上有图标和文本的Action Item和“更多”菜单项的图标。

 

图2有图标和文本的菜单项及“更多”菜单项图标

如下是如何在菜单资源(menu resource)文件中将菜单项声明为Action Item的例子:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_save"
          android:icon="@drawable/ic_menu_save"
          android:title="@string/menu_save"
          android:showAsAction="ifRoom|withText" />
</menu>

在这个例子当中,同时设置了“ifRoom”和“withText”属性值,因此,当菜单显示在ActionBar上时,会同时显示图标和文本。

在ActionBar上的菜单项和在选项菜单中(options menu)中菜单项一样会触发相同的回调方法。当用户选择一个Action Item时,Activity会接收到对onOptionsItemSelected()回调方法的调用,并且传入菜单项的ID值。

注意:如果你是在一个fragment中添加的菜单项,那么对于相应fragment的onOptionsItemSelected()方法也会被调用。但是Activity的拥有首先处理的优先权,即首先调用到Activity的onOptionsItemSelected()方法,然后再调用fragment的onOptionsItemSelected()的方法。

你也可以声明一个菜单项一直在ActionBar上显示,但是最好避免这么做,因为如果有太多的Acton Item的话会导致一个杂乱的UI,并且可能会和ActionBar上得其他元素冲突。

要知道跟多Menu内容的话,可以查看Menu开发指导。

使用应用图标作为Action Item

默认情况下,应用的图标出现在ActionBar的左侧。应用图标同样会对用户交互做出响应(当用户触碰到图标时,它会和一般的Action Item做出一样的响应),并且用户触碰到图标要做的事情就是开发者的任务了。

 

图3 Email的ActionBar,应用图标在左侧

当用户触及到图标时,正常的行为时应用回到其主界面,或者回到初始状态(例如,Activity没有改变,但是fragment改变了)。如果用户已经在主界面并在初始初始状态,那么你就不需要再坐什么事情。

当用户点击应用图标时,系统调用Activity的onOptionsItemSelected()方法并传入R.id.home ID值。因此,你需要在onOptionsItemSelected()方法中添加一个条件来监听R.id.home并作出一个合适的响应,例如返回主界面或者弹出最近的fragment业务。

如果你以返回应用主界面来相应用户点击,那么你需要在Intent中包含FALG_ACTIVITY_CLEAR_TOP。使用这个标志位,当你要启动的Activity在当前的task中已经存在时,在该Activity(在堆栈中)上面的其他Activity都被销毁,目标Activity就显示在屏幕前面。你应该更加选择这个方法,因为返回应用主界面的行为相当于“going back”并且通常你不应该创建应用home activity的一个新实例。否则,在当前的task中你遭遇到长的Activity栈的返回结果。

例如,如下是回到应用主界面的onOptionsItemSelected()方法的实现:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in Action Bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

使用应用图标往回导航(navigate “up”)

你也可以使用应用图标为用户提供“向上”导航功能。这在你的应用由多个Activity组成时很有用,多个Activity按一定的顺序显示并且在Activity层次上为用户简化导航向上的功能(不管是怎样进入到当前的Activity)。

对这个事件的响应方式和返回应用主界面的方式一样【代码一样】(如上讨论的,除了启动一个不同的Activity之外,都是基于当前的Activity)。你所需要做的事情是设置ActionBar“向上显示主界面”(show home as up)的功能来向用户表示一种不同的行为。你可以通过调用对应Activity的ActionBar的setDisplayHomeAsUpEnabled(true)来完成此功能。当你这么做的时候,系统绘制带箭头的应用图标,如图4。

 图4 标准的Email应用图标(上)和“向上”图标(下)

例如,如下是你如何来显示一个“向上”的图标:

@Override
protected void onStart() {
    super.onStart();
    ActionBar actionBar = this.getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
}

那样,你的Activity应该在onOptionsItemSelected()方法中对R.id.home ID值进行监听(如上显示)来响应用户点击应用图标。在这个例子中,对于在Intent中使用FLAG_ACTIVITY_CLEAR_TOP标识位尤其重要,以至于当一个Activity已经存在时无需再创建一个实例。

添加Action视图(Action View)

一个Action视图实际上是出现在ActionBar上的组件,它取代了在ActionBar上得Action Item。例如,如果你的选项菜单(options menu)中有“搜素”菜单,只要Action Item可用,你都可以为菜单项添加一个Action视图来提供搜索组件(SearchView)。

当为一个菜单项添加一个Action视图,菜单项没有在ActionBar上出现时,允许Action Item像一个正常的菜单项一样进行行为很重要。例如,默认情况下,执行搜索功能的菜单项(options menu)应该会产生一个Android搜索对话框,但是如果这个菜单项放到ActionBar当中,Action视图会带着SearchView组件出现在ActionBar上。图5显示了出现在ActionBar上的SearchView组件。

 

图5 带有SearchView组件的Action视图

声明一个Action视图最好的方式是在你的菜单资源(menu resource)当中使用android:actionLayout或者android:actionViewClass属性:

① android:actionLayout的值必须是一个布局文件的引用,例如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_search"
        android:title="Search"
        android:icon="@drawable/ic_menu_search"
        android:showAsAction="ifRoom"
        android:actionLayout="@layout/searchview" />
</menu>

② android:actionViewClass的值必须是你使用的视图类的完全限定名,例如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_search"
        android:title="Search"
        android:icon="@drawable/ic_menu_search"
        android:showAsAction="ifRoom"
        android:actionViewClass="android.widget.SearchView" />
</menu>

当有足够的空间时,为了使Action视图出现在ActionBar上,你必须按次序包括android:showAsAction="ifRoom"。但是,如果有必要,你可以设置设置android:showAsAction的值为“always”来让菜单项做为Action视图出现。

现在,当一个菜单项作为Action Item显示时,它的Action视图会出现,而不是它的图标或者/和文本。但是,如果ActionBar上没有足够的空间,Action Item像一般选项菜单一样显示在“更多”菜单项中,而且在onOptionsItemSelected()回调中对菜单事件作出回应。

当Activity首次启动的时候,系统会调用onCreateOptionsMenu()方法来创建ActionBar上得Action Item和“更多”菜单中的菜单项。当你在这个方法中创建菜单后,你可以通过菜单的ID值和findItem()方法获得MenuItem对象,然后再调用MenuItem对象的getActionView()方法在Action视图中获得相关元素(可能是为了添加监听器)。例如,像上面声明的搜索组件可以向如下的方式来进行获得:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.options, menu);
  SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
  // Set appropriate listeners for searchView
  ...
  return super.onCreateOptionsMenu(menu);
}

想要获得更多有关SearchView的信息,可以查看创建搜索界面的开发知道。

增加标签(tabs)

在Activity中ActionBar可以显示tabs,来使用户可以再不通的fragment之间进行切换。每个tab可以包含图标或者/和文本。

开始之前,你的布局中必须包含一个View,View当中要包含和tab相关联的需要进行显示的fragment。而且必须确保你的View有ID,以便在代码中可以被引用。

 

图6 ActionBar上的tab,截图是gallery实例应用

在ActionBar上增加tab:

1. 首先是创建一个队ActionBar.TabListener的实现,以便来处理tab交互时的事件。你必须实现所有的方法:onTabSeleceted(),onTabUnselected()和onTabReselected()。

  每个回调都传入ActionBar.Tab对象,ActionBar.Tab对象接收事件及用来执行fragment业务的一个FragmentTransaction对象(增加或者删除fragment)。

  例如:

private class MyTabListener implements ActionBar.TabListener {
    private TabContentFragment mFragment;

    // Called to create an instance of the listener when adding a new tab
    public MyTabListener(TabContentFragment fragment) {
        mFragment = fragment;
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_content, mFragment, null);
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(mFragment);
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

}

这一对ActionBar.TabListener实现增加了一个构造方法,用以保存与tab相关的fragment,这样在每个回调中就可以对该fragment进行添加或者删除。

2. 在onCreate()方法中调用getActionBar()方法来获得Activity的ActionBar对象。(但是要确保在表用getActionBar()方法之前已经调用了setContentView()方法)。

3. 调用ActionBar的setNavigationMode(NAVIGATION_MODE_TABS)方法来启用其tab模式。

4. 为ActionBar创建tab

       1. 在ActionBar上调用newTab()来创建一个ActionBar.Tab对象。

       2. 调用setIcon()和/或者setText()方法来增加图标和/或者标题。

          指点:这些方法返回的是同一个ActionBar.Tab对象,因此可以连续调用

       3. 在setTabListener()方法中传入声明的ActionBar.TabListener实现对象。

5. 在ActionBar上调用addTab()并传入ActionBar.Tab来在ActionBar上增加标签。

例如,如下是进行了第2~5步在ActionBar上增加标签:

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

    // setup Action Bar for tabs
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    // remove the activity title to make space for tabs
    actionBar.setDisplayShowTitleEnabled(false);

    // instantiate fragment for the tab
    Fragment artistsFragment = new ArtistsFragment();
    // add a new tab and set its title text and tab listener
    actionBar.addTab(actionBar.newTab().setText(R.string.tab_artists)
            .setTabListener(new TabListener(artistsFragment)));

    Fragment albumsFragment = new AlbumsFragment();
    actionBar.addTab(actionBar.newTab().setText(R.string.tab_albums)
            .setTabListener(new TabListener(albumsFragment)));
}

当tab被选择时所进行的行为你都要在ActionBar.TabListener的回调方法中进行定义。当一个tab被选择时,onTabSelected()方法被调用并且在此方法中可以使用提供的FragmentTransaction的add()方法在目标视图(View)中添加适合的fragment。同样地,当一个tab没有被选择(因为另一个tab被选择),你应该使用remove()方法从布局中移除fragment。

小心:对这次transaction你不必调用commit()方法——因为系统会为你调用,如果你自己调用可能会派出异常。你也不能将这些fragment transaction增加到后台栈当中。

当你的Activity stop()时,你应该保留住当前的tab和其状态以便在用户返回到应用时可以打开tab。当要保存状态时,你可以调用getSelectedNavigatonIndex()方法来访问当前被选中的tab,这个方法返回被选中的tab的索引位置。

小心:适时保存fragment的状态时很重要得事情,以为当用户在tab之间的fragment当中切换,又返回之前的fragment。要获得更多有关fragment保存状态的信息,可以查看fragment开发知道。

增加下拉导航(drop-down navigation)

作为Activity的另外一种导航模式,你可以在ActionBar上提供下拉列表。例如,下拉列表可以为Activity提供对内容进行排序或者更换账号提供选择。

如下是快速使用下拉模式的步骤:

1. 为下拉列表创建一个列表项的SpinnerAdapter和放置每个列表项的布局。

2. 实现ActionBar.OnNavigationListener来定义当列表项被选择时进行的操作。

3. 使用setNavigationMode()方法启用导航功能,例如:

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

       注意:你应该在onCreate()方法中执行这段代码。

4. 然后,调用setListNavigationCallbacks()方法为下拉列表设置回调,例如:

actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

      这个方法需要SpinnerAdapter和ActionBar.OnNavigationListener作为参数。更多内容继续往下看。

    

这些是基本步骤。但是大多数的工作实现的SpinnerAdapter和ActionBar.OnNavigationListener中已经做了。有许多的方式来为你的下拉列表定义功能,而对SpinnerAdapter的许多实现方式已经超出了这部分文档的说明范围(你应该参照SpinnerAdapter类来获得更多的知识)。但是,下面是对SpinnerAdapter的一种实现和ActionBar.OnNavigationListener的实现。

对SpinnerAdapter和ActionBar.OnNavigationListener的实例:

SpinnerAdapter是为spinner组件提供数据的一个适配器,例如为ActionBar上下拉列表提供数据。SpinnerAdapter是一个接口,你可以对其进行实现,但是在Android中包含若干个你可以进行扩展的接口,录入ArrayAdapter和SimpleCursorAdapter。例如,下面是使用ArrayAdapter来创建一个SpinnerAdapter的一种简单实现,它使用一个字符串数组作为数据源:

SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list,android.R.layout.simple_spinner_dropdown_item);

createFromResource()方法有三个参数:应用Context,数组资源ID,每个列表项的布局。

一个定义好的字符串数组就像下面的一样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="action_list">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
    </string-array>
</resources>

createFromResource()所返回的ArrayAdapter对象就这样实现了并且可以准备好传入到setListNavigationCallbacks()方法中(像在第4步中进行的一样)。但是在你这么做之前,你应该先创建OnNavigationListener对象。

在ActionBar.OnNavigationListener的实现当中,你可以处理用户在下拉列表中选择一个列表项时产生的事件,你可以对fragment的改变进行处理或者在Activity上得其他修改。在这个监听中只有一个回调:onNavigationItemSelected()。

onNavigationItemSelected()方法中接收列表项在列表中的位置值和SpinnerAdapter提供的唯一的列表项的ID值。

下面是对OnNavigationListener的一个匿名实现,在实现当中,在R.id.fragment_container所表示的布局容器中插入fragment:

mOnNavigationListener = new OnNavigationListener() {
  // Get the same strings provided for the drop-down's ArrayAdapter
  String[] strings = getResources().getStringArray(R.array.action_list);

  @Override
  public boolean onNavigationItemSelected(int position, long itemId) {
    // Create new fragment from our own Fragment class
    ListContentFragment newFragment = new ListContentFragment();
    FragmentTransaction ft = openFragmentTransaction();
    // Replace whatever is in the fragment container with this fragment
    //  and give the fragment a tag name equal to the string at the position selected
    ft.replace(R.id.fragment_container, newFragment, strings[position]);
    // Apply changes
    ft.commit();
    return true;
  }
};

完成了对OnNavigationListener的实现,接下来你就可以调用setListNavigationCallbacks()方法(在第4步中的操作),并且传入ArrayAdapter和OnNavigationListener。

在这个例子当中,当用户在列表中选择了一个列表项,一个fragment就被添加到了布局当中(在R.id.fragment_container中取代当前的fragment)。被添加的fragment上被给予了一个唯一定义的tag,这个tag与被用来定义下拉列表中的列表项的tag一样。

下面的例子让我们看看ListContentFragment类中定义的每个fragment:

public class ListContentFragment extends Fragment {
    private String mText;

    @Override
    public void onAttach(Activity activity) {
      // This is the first callback received; here we can set the text for
      // the fragment as defined by the tag specified during the fragment transaction
      super.onAttach(activity);
      mText = getTag();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // This is called to define the layout for the fragment;
        // we just create a TextView and set its text to be the fragment tag
        TextView text = new TextView(getActivity());
        text.setText(mText);
        return text;
    }
}

ActionBar的自定义风格

ActionBar是应用的基础也是用户进行交互的基本点,因为你有可能为了使使用户使用起来觉得与应用更加一致而修改ActionBar的设计。

要对ActionBar进行简单修改,你可以使用下面的方法:

setBackgroundDrawable():

    使用一个drawable来用作ActionBar的背景。一个drawable可以是一个9.png图片, 

一个形状或者一个填充颜色。这样,系统就可以根据ActionBar的大小来调整drawable

的大小(最好不要使用固定大小的图片资源)。

setDiaplayUseLogoEnabled():

    在ActionBar上使用一个可选图片(比如Logo),而不是应用图标。一个logo通常

是一个更宽更清楚地代表一个应用。如果启用了这个功能,那么在AndroidManifest当

中就可以为应用(或者某个Activity)定义一个logo的图片资源,使用android:logo属

性来进行定义。Logo将为适应ActionBar的高度被适时地缩放。(作为应用logo,最好

的实际就是设计大小相同的logo)

要获得更多更复杂的自定义风格,可以查看style and theme开发指导,可以获得有集中方式来自定义ActionBar的风格。

ActionBar有两个标准的风格,“dark”和“light”。dark主题默认跟随这holographic主题被应用。如果你想要一个白底黑字风格,在Manifest当中你可以使用Theme.Holo.Light主题。例如:

<activity android:name=".ExampleActivity"
          android:theme="@android:style/Theme.Holo.Light" />

对于更多的设置,你可以重写Theme.Holo或者Theme.Holo.Light主题并在ActionBar的某个方面去应用自定义风格。下面是你可以使用来进行自定义的一些属性:

android:actionBarTabStyle

    定义ActionBar.Tab的风格。

android:actionBarTabBarStyle

    ActionBar的tab后面的风格。

android:actionBarTabTextStyle

    Tab上文字的风格。

android:actionDropDownStyle

    “更多”菜单中下拉风格

android:actionButtonStyle

    在ActionBar上得按钮的背景图片的风格

例如,下面是基于Theme.Holo主题的自定义风格:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBar" parent="android:style/Theme.Holo.Light">
        <item name="android:actionBarTabTextStyle">@style/customActionBarTabTextStyle</item>
        <item name="android:actionBarTabStyle">@style/customActionBarTabStyle</item>
        <item name="android:actionBarTabBarStyle">@style/customActionBarTabBarStyle</item>
    </style>

    <!-- style for the tab text -->
    <style name="customActionBarTabTextStyle">
        <item name="android:textColor">#2966c2</item>
        <item name="android:textSize">20sp</item>
        <item name="android:typeface">sans</item>
    </style>

    <!-- style for the tabs -->
    <style name="customActionBarTabStyle">
        <item name="android:background">@drawable/actionbar_tab_bg</item>
        <item name="android:paddingLeft">20dp</item>
        <item name="android:paddingRight">20dp</item>
    </style>

    <!-- style for the tab bar -->
    <style name="customActionBarTabBarStyle">
        <item name="android:background">@drawable/actionbar_tab_bar</item>
    </style>
</resources>

注意:为了基于当前的tab状态(选中,按下,不选择)来改变背景图片,drawable资源必须是state list drawable。同样,要保证你声明了一个父主题,从这个父主题是继承的,没有在现在的主题中进行显示声明。

你可以再Manifest当中对私有的Activity或者整个应用使用这个自定义个风格,例如:

<application android:theme="@style/CustomActionBar"
             ... />

此外,如果你想为你的Activity创建自定义主题,而你的Activity已经完全移除了ActionBar,使用下面的风格属性:

android:windowActionBar

    设置这个属性值为false可以移除ActionBar

android:windowNoTitle

    设置这个属性值为true,同样移除传统的标题栏

要获取更多有关在应用中使用风格和主题,可以查看Styles and Themes文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android4.0 ActionBar API 的相关文章

  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐

  • 裸设备和Oracle问答20例

    1 什么叫做裸设备 裸设备 也叫裸分区 原始分区 是一种没有经过格式化 不被Unix通过文件系统来读取的特殊字符设备 它由应用程序负责对它进行读写操作 不经过文件系统的缓冲 2 如何辨别裸设备 在Unix的 dev 目录下 有许多文件 其中
  • 【C++设计模式】开放-封闭原则

    2023年8月27日 周日下午 我觉得我的这篇博客还是写得很不错的 哈哈哈 目录 概述 举例说明 用开放 封闭原则重构 概述 开放 封闭原则 Open Closed Principle OCP 是面向对象设计中的一个重要原则 也是许多设计模
  • shineblink CoreTFT串口屏开发

    TFT液晶触摸屏 一 开发基础准备工作 二 本章节实现功能介绍 三 接线图 四 开发板端完整代码 五 液晶屏页面的开发 六 代码运行结果 Shineblink Core 可支持3 5寸 4寸 7寸的TFT串口彩色液晶屏 本篇章主要演示了TJ
  • Windows 常用快捷键

    常用快捷键 Ctrl C 复制选定项 Ctrl X 剪切选定项 Ctrl V 粘贴选定项 Ctrl Z 撤消操作 Ctrl Y 重做操作 Ctrl S 保存 Ctrl A 选择文档或窗口中的所有项目 Alt Tab 在打开的应用之间切换 W
  • Qt Utils : To-Do

    Qt Creator自带的todo插件工具 真心舒爽 特别是对于我这种记不住三天前自己写的shit mountain的 渣渣CXY来讲 边撸代码边注释 快速查阅Task 非常重要 1 上效果图 2 工具使用 1 勾选使用插件 重启Qt Cr
  • 7-32 统计MOOC证书

    本题要求编写程序 输入N个学生的MOOC成绩 统计优秀 合格证书的数量 以及没有获得证书的数量 学生修读程序设计MOOC 85分及以上获得优秀证书 不到85分但是60分及以上获得合格证书 不到60分则没有证书 输入格式 输入在第一行中给出非
  • 如何安装新的PHP扩展模块

    一 phpize方式 该方法用于安装php源码ext目录中没有的扩展 1 下载源码 2 解压并进入扩展目录 3 执行phpize 4 执行 configure 5 make make install 6 在php ini 文件中添加 ext
  • JAVA识别复杂验证码+图像处理

    先对验证码进行简单的处理噪点和纯色 例未曾处理的图片 public static void main String args throws Exception 源文件 String picName C Users syxy101 Deskt
  • 您无权输入许可证密钥,请请使用系统管理员账户重试

    转载于 https www cnblogs com java2016 p 5448093 html
  • Android 解决Retrofit请求数据,数据过多,返回json数据乱码问题

    同一个POST请求返回的数据 有时候乱码 有时候不乱码 最后发现 数据量过多就会出现乱码 直接使用原生HttpUrlConnection请求不会产出乱码 我猜测就是框架配置的问题 然后在网上寻找解决方面发现一个帖子类似我这种问题 地址 问题
  • 小米9 MIUI12.5 红米 K40s MIUI13.0.10 安装谷歌框架

    前言 由于更换了小米9手机后 我想重新安装谷歌框架的 发现这谷歌框架安装不上了 下载第三方安装框架工具也是不行 然后看到一篇文章说小米9手机自带有个GMS服务框架 然后我试了一下还真的可以 所以分享一下 如果文章没了说明我已经进去了 设备
  • 【OJ刷题

    欢迎关注微信公众号 Python小灶 和我一起每天学习Python新知识 还可添加博主Vx yf03064131 方便一起交流学习 或者B站搜索 有只小新 文章目录 多数组合并 数组排序 最长的指定瑕疵度的元音字串 20210909 总共三
  • 2016的诗和远方

    当生活被眼前的苟且蒙住了双眼 其实你所希冀的远方 就在那噼啪敲击的键盘里 渗入脑海实现想法的一行行代码中 眼看一年就要结束了 坐在公司的办公区里 窗外霓虹灯五光十色 办公楼鳞次栉比 恍惚想起了这一年充满波折又熠熠生辉的日子 却又是欲买桂花同
  • 新建文件夹命令 linux,linux创建文件夹命令是什么

    linux创建文件夹命令是mkdir 语法为 mkdir 选项 参数 其中Z为设置安全上下文 当使用SELinux时有效 version显示版本信息 本文操作环境 linux2 6 32系统 DELL G3电脑 Linux中 mkdir 创
  • CEVA RivieraWaves™ Wi-Fi IP

    https www ceva dsp com product rivierawaves wi fi platforms OVERVIEW The RivieraWaves Wi Fi IP family is a comprehensive
  • 提交本地项目到GitHub

    文章目录 1 下载git 1 1 通过homebrew安装Git 1 2 通过Xcode安装 2 创建ssh key 配置git 3 提交本地项目到GitHub 说明 该博文参考这篇文章和这段视频 1 下载git 1 1 通过homebre
  • 全面了解Maven依赖范围

    Maven依赖范围 翻译原文详见 Maven Dependency Scopes 1 总览 Maven 是 Java 生态系统中最流行的构建工具之一 其核心特性之一是依赖管理 Maven is one of the most popular
  • vue应用的简单例子、$.get()方法及页面获取url里面的参数

    vue应用的简单例子 get 方法及页面获取url里面的参数 页面 要先引入vue的js div 123 hospital name div
  • C++学习笔记:函数绑定器(bind用法)

    绑定器bind总览 bind用于绑定可调用 Callable 对象 函数对象 指向函数指针 到函数引用 指向成员函数指针或指向数据成员指针 和其参数 返回值为绑定成功后的函数对象 在正式开始绑定器前 先进行一下知识补充 补充1 函数对象 函
  • android4.0 ActionBar API

    ActonBar介绍 ActionBar取代了传统的标题栏 title 其在activity位置就是title原有的位置 在activity的顶部 ActionBar上默认情况下包括了应用 app 的logo logo的位置在ActionB