`
huaxin803
  • 浏览: 113269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 用户界面---操作栏(Action Bar 三)

 
阅读更多
添加操作视窗

操作视窗是作为操作项目按钮的替代品显示在操作栏中的一个可视构件。例如,如果你有一个用于搜索的可选菜单项,你可以用SearchView类来替代操作栏上的搜索按钮,如图7所示:

pic

图7. 折叠(上)和展开(下)的搜索视窗的操作栏

要个菜单资源中的一个项目声明一个操作视窗,你既可以使用android:actionLayout属性也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="@string/menu_search"
              android:icon="@drawable/ic_menu_search"
           android:showAsAction="ifRoom|collapseActionView"
           android:actionViewClass="android.widget.SearchView" />
</menu>

android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。

如果需要给操作视窗添加一些事件,那么就需要在onCreateOptionsMenu()回调执行期间做这件事。你能够通过调用带有菜单项ID的findItem()方法来获取菜单项,然后再调用getActionView()方操作视窗中的元素。例如,使用以下方法获取上例中的搜索视窗构件。

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

处理可折叠的操作视窗

操作视窗让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。但是,默认情况下让操作视窗可见可能不太合适。要保证操作栏的空间(尤其是在小屏幕设备上运行时),你能够把操作视窗折叠进一个操作项按钮中。当用户选择这个按钮时,操作视窗就在操作栏中显示。被折叠的时候,如果你定义了android:showAsAction=”ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在操作栏中。通过给android:showAsAction属性添加“collapseActionView”属性值,你能够让操作视窗可以折叠起来。

因为在用户选择这个项目时,系统会展开这个操作视窗,所以你不必要在onOptionsItemSelected()回调方法中响应这个菜单项。在用户选择这个菜单项时,系统会依然调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个操作视窗。

当用户选择了操作栏中的“向上”图标或按下了回退按钮时,系统也会把操作视窗折叠起来。

如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠操作视窗。

注意:尽管把操作视窗折叠起来是可选的,但是,如果包含了SearchView对象,我们推荐你始终把这个视窗折叠起来,只有在需要的时候,由用户选择后才把它给展开。在提供了专用的“搜索”按钮的设备上也要小心了,如果用户按下了“搜索”按钮,那么也应该把这个搜索视窗给展开,简单的重写Activity的onKeyUp()回调方法,监听KEYCODE_SEARCH类型的按键事件,然后调用expandActionView()方法,就可以把操作视窗给展开。

如果你需要根据操作视窗的可见性来更新你的Activity,那么你可以定义一个OnActionExpandListener事件,并且用setOnActionExpandListener()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了,如:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    MenuItem menuItem = menu.findItem(R.id.actionItem);
    ...

    menuItem.setOnActionExpandListener(new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when collapsed
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            return true;  // Return true to expand action view
        }
    });
}

添加一个操作提供器

与操作视窗类似,操作提供器(由ActionProvider类定义的)用一个定制的布局代替一个操作项目,它还需要对所有这些项目行为的控制。当你在操作栏中给一个菜单项声明一个操作项目时,它不仅要一个定制的布局来控制这个菜单项的外观,而且当它在显示在溢出菜单中时,还要处理它的默认事件。无论是在操作栏中还是在溢出菜单中,它都能够提供一个子菜单。

例如,ActionProvider的扩展类ShareActionProvider,它通过在操作栏中显示一个有效的共享目标列表来方便共享操作。与使用传统的调用ACTION_SEND类型Intent对象的操作项不同,你能够声明一个ShareActionProvider对象来处理一个操作项。这种操作提供器会保留一个带有处理ACTION_SEND类型Intent对象的应用程序的下拉列表,即使这个菜单项显示在溢出菜单中。因此,当你使用像这样的操作提供器时,你不必处理有关这个菜单项的用户事件。

要给一个操作项声明一个操作提供器,就要在菜单资源中对应的<item>元素中定义android:actionProviderClass属性,提供器要使用完整的类名。例如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:id="@+id/menu_share"
          android:title="@string/share"
          android:showAsAction="ifRoom"
          android:actionProviderClass="android.widget.ShareActionProvider" />
  ...
</menu>

在这个例子中,用ShareActionProvider类作为操作提供器,在这里,操作提供器需要菜单项的控制,并处理它们在操作栏中的外观和行为以及在溢出菜单中的行为。你必须依然给这个菜单项提供一个用于溢出菜单的文本标题。

尽管操作提供器提供了它在溢出菜单中显示时所能执行的默认操作,但是Activity(或Fragment)也能够通过处理来自onOptionsItemSelected()回调方法的点击事件来重写这个默认操作。如果你不在这个回调方法中处理点击事件,那么操作提供器会接收onPerformDefaultAction()回调来处理事件。但是,如果操作提供器提供了一个子菜单,那么Activity将不会接收onOptionsItemSelected()回调,因为子菜单的显示替代了选择时调用的默认菜单行为。

使用ShareActionProvider类

如果你想要在操作栏中提供一个“共享”操作,以充分利用安装在设备上的其他应用程序(如,把一张图片共享给消息或社交应用程序使用),那么使用ShareActionProvider类是一个有效的方法,而不是添加一个调用ACTION_SEND类型Intent对象的操作项。当你给一个操作项使用ShareActionProvider类时,它会呈现一个带有能够处理ACTION_SEND类型Intent对象的应用程序的下拉列表(如图8所示)。

pic

图8. Gallery 应用截屏,用ShareActionProvider对象展开显示共享目标。

创建子菜单的所有逻辑,包括共享目标的封装、点击事件的处理(包在溢出菜单中的项目显示)等,都在ShareActionProvider类中实现了---你需要编写的唯一的代码是给对应的菜单项声明操作提供器,并指定共享的Intent对象。

默认情况,ShareActionProvider对象会基于用户的使用频率来保留共享目标的排列顺序。使用频率高的目标应用程序会显示在下来列表的上面,并且最常用的目标会作为默认共享目标直接显示在操作栏。默认情况下,排序信息被保存在由DEFAULT_SHARE_HISTORY_FILE_NAME指定名称的私有文件中。如果你只使用一种操作类型ShareActionProvider类或它的一个子类,那么你应该继续使用这个默认的历史文件,而不需要做任何事情。但是,如果你使用了不同类型的多个操作的ShareActionProvider类或它的一个子类,那么为了保持它们自己的历史,每种ShareActionProvider类都应该指定它们自己的历史文件。给每种ShareActionProvider类指定不同的历史文件,就要调用setShareHistoryFileName()方法,并且提供一个XML文件的名字(如,custom_share_history.xml)

注意:尽管ShareActionProvider类是基于使用频率来排列共享目标的,但是这种行为是可扩展的,并且ShareActionProvider类的扩展能够基于历史文件执行不同的行为和排序。

要添加ShareActionProvider对象,只需简单的给android.actionProviderClass属性设定android.widget.ShareActionProvider属性值就可以了。唯一要做的事情是定义你要用于共享的Intent对象,你必须先调用getActionProvider()方法来获取跟菜单项匹配的ShareActionProvider对象,然后调用setShareIntent()方法。

如果对于共享的Intent对象的格式依赖与被选择的菜单项,或其他的在Activity生存周期内改变的变量,那么你应该把ShareActionProvider对象保存在一个成员属性里,并在需要的时候调用setShareIntent()方法来更新它。如:

private ShareActionProvider mShareActionProvider;
...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();

    // If you use more than one ShareActionProvider, each for a different action,
    // use the following line to specify a unique history file for each one.
    // mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");

    // Set the default share intent
    mShareActionProvider.setShareIntent(getDefaultShareIntent());

    return true;
}
// When you need to update the share intent somewhere else in the app, call
// mShareActionProvider.setShareIntent()

上例中ShareActionProvider对象处理所有的跟这个菜单项有关的用户交互,并且不需要处理来自onOptionsItemSelected()回调方法的点击事件。

分享到:
评论

相关推荐

    android-support-v4 android-support-v7-appcompat

    Action Bar是Android应用中一种重要的UI元素,它提供了一种统一的导航和操作方式。`appcompat-v7`库通过引入一个自定义的ActionBar实现,使得开发者可以为旧版本的Android设备添加Action Bar功能。此外,它还包含了...

    android-support-v4+android-support-v7-appcompat组合包

    集成这两个库后,开发者就可以在Unity中使用Android的高级特性,比如使用Fragment来构建复杂的用户界面,或者利用AppCompat库提供的Material Design风格。然而,需要注意的是,由于Unity的特性,可能需要使用Java...

    android-support-v7和android-support-v7-recyclerview的classes.jar

    它提供了一个自定义的`Activity`类——`AppCompatActivity`,该类实现了对Material Design风格的支持,包括Action Bar、ToolBar以及主题颜色等,使得开发者可以在低版本Android设备上实现现代Android界面的风格。...

    android-support-v7-appcompat.zip

    在Android开发中,`android-support-v7-appcompat`库是一个至关重要的组件,它极大地扩展了Android API的功能,使得开发者能够在更广泛的设备上实现一致的用户界面和功能。这个库是Android Support Library系列的一...

    android支持包:android-support-v4

    `android-support-v4`库提供了对Fragment的兼容,使得开发者可以在更低版本的Android设备上使用Fragment来构建更加复杂的用户界面。Fragment可以单独添加、移除或替换到Activity中,从而实现动态的布局管理和更灵活...

    android_action-bar

    Action Bar是Android 3.0(API级别11)引入的,用于提供一个统一的用户界面元素,它包含了应用的Logo、标题、菜单项以及可扩展的操作。Action Bar的设计旨在提高应用的可发现性和可用性,让用户更容易地与应用进行...

    Action bar 操作栏

    在Android应用开发中,Action Bar(操作栏)是界面设计中的一个重要组成部分,它为用户提供了一种统一且高效的交互方式。这个部分将详细讲解Action Bar的基本概念、功能、设计原则以及如何在代码中实现。 一、...

    android-support-v4.jar,android-support-v7-appcompat.jar

    这个库中最显著的特性就是实现了ActionBar,使得开发者能够在旧版本的Android上使用类似于新版本中的Action Bar,提供统一的导航和操作界面。除此之外,它还支持Toolbar,这是一个可定制的视图,可以作为Activity的...

    blog.rar_android_android-support-v4_blog

    3. **AppCompatActivity**:基于`android.support.v7.app.AppCompatActivity`,提供了对ActionBar的支持,使得在API 14以下的版本也能使用Action Bar,提供统一的UI体验。 4. **PagerAdapter**:用于创建滑动界面,...

    Android-ObservableScrollView-master

    "Android-ObservableScrollView-master"是一个非常实用的开源库,它专注于解决一个常见的设计问题:如何优雅地处理ScrollView或NestedScrollView的滚动事件,并与诸如Toolbar(也称为Action Bar)这样的组件进行交互...

    android-actionbar-master.zip_android_android actionbar组件

    Action Bar为用户提供了一种统一的界面风格,使其与Android系统的其他应用保持一致,同时也提高了用户体验。本资源“android-actionbar-master.zip”提供了一个通用的Android ActionBar实现,旨在帮助开发者更高效地...

    android-actionbar-for-2.x.x.7z

    在描述中,“android-actionbar-for-2.x.x.7z”并没有提供额外的信息,但我们可以推断,这个压缩包可能包含了第三方库或自定义实现,使得开发者能够在Android 2.x设备上使用Action Bar功能。 标签“android-...

    自定义Android Action Bar的布局

    Action Bar是Android 3.0(API级别11)引入的一个特性,目的是为了提供一种更统一的用户界面设计。在Android 4.0(API级别14)及以后的版本中,它已经成为系统默认样式的一部分。即使在更早的版本,通过使用兼容库...

    android-support-v7.jar

    4. **菜单和选项菜单**:这个库还处理了菜单和选项菜单的适配问题,使得在低版本Android上也能使用Action Bar中的菜单项。 5. **自定义视图**:对于自定义视图,android-support-v7-appcompat库提供了一些抽象类,...

    android-support-v4+v7

    此外,`appcompat-v7`还包含了对ToolBar、FloatingActionButton、Snackbar等Material Design组件的兼容,使得开发者能为老版本的Android设备提供现代感的用户界面。 除了`appcompat-v7`,`android-support-v7`库还...

    android-support-v7-appcompat【2分】

    1. **ActionBar**: 提供了一种在早期Android版本上实现类似Action Bar的界面元素,它包含了下拉菜单、搜索框和操作按钮等功能,显著提升了应用的导航体验。 2. **主题兼容性**: 允许开发者在低版本Android上使用...

    Android中Action Bar的使用

    在Android应用开发中,Action Bar是一个非常重要的组件,它位于应用程序界面的顶部,提供了一种标准的方式来展示应用程序的标识、主要的操作以及一个可选的下拉菜单,通常用于导航。本篇文章将深入探讨如何在Android...

    Android SDK 2.2-4.4

    - **行动栏(Action Bar)**:提供统一的导航和操作方式,简化了用户界面。 - **多窗口任务切换**:支持多窗口任务切换,提高了生产力。 - **碎片(Fragments)**:允许在单个活动中展示多个视图,适应不同屏幕尺寸...

    Android-Glass-Action-Bar-Sample

    标题“Android-Glass-Action-Bar-Sample”表明这是一个关于Android应用开发的项目示例,主要关注的是在Android设备上实现类似Google Glass的Action Bar设计。Action Bar是Android系统中的一个关键组件,它提供了应用...

Global site tag (gtag.js) - Google Analytics