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

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

 
阅读更多
创建一个定制的操作提供器

当你想要创建一个有动态行为和在溢出菜单中有默认图标的操作视窗时,,继承ActionProvider类来定义这些行为是一个比好的的方案。创建自己的操作提供器,提供一个有组织的可重用的组件,而不是在Fragment或Activity的代码中处理各种操作项的变换和行为。

要创建自己的操作提供器,只需简单的继承ActionProvider类,并且实现合适的回调方法。你应该实现以下重要的回调方法:

ActionProvider()

这个构造器把应用程序的Context对象传递个操作提供器,你应该把它保存在一个成员变量中,以便其他的回调方法使用。

OnCreateActionView()

这是你给菜单项定义操作视窗的地方。使用从构造器中接收的Context对象,获取一个LayoutInflater对象的实例,并且用XML资源来填充操作视窗,然后注册事件监听器。如:

public View onCreateActionView() {
    // Inflate the action view to be shown on the action bar.
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View view = layoutInflater.inflate(R.layout.action_provider, null);
    ImageButton button = (ImageButton) view.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do something...
        }
    });
    return view;
}

onPerformDefaultAction()
在选中溢出菜单中的菜单时,系统会调用这个方法,并且操作提供器应该这对这个选中的菜单项执行默认的操作。

但是,如果你的操作提供器提供了一个子菜单,即使是溢出菜单中一个菜单项的子菜单,那么也要通过onPrepareSubMenu()回调方法来显示子菜单。这样onPerformDefaultAction()在子菜单显示时就不会被调用。

注意:实现了onOptionsItemSelected()回调方法的Activity或Frament对象能够通过处理item-selected事件(并且返回true)来覆盖操作提供器的默认行为,这种情况下,系统不会调用onPerformDefaultAction()回调方法。

添加导航选项标签

当你想要在一个Activity中提供导航选择标签时,使用操作栏的选项标签是一个非常好的选择(而不是使用TabWidget类),因为系统会调整操作栏选项标签来适应不同尺寸的屏幕的需要---在屏幕足够宽的时候,导航选项标签会被放到主操作栏中;当屏幕太窄的时候,选项标签会被放到一个分离的横条中,如图9和图10所示。

pic

图9. Honeycomb Gallery应用程序中的操作栏选项标签的截图

http://developer.android.com/resources/samples/HoneycombGallery/index.html

pic

图10. 在窄屏设备上被堆放在操作栏中的选项标签的截屏

要使用选项标签在Fragmengt之间切换,你必须在每次选择一个选项标签时执行一个Fragment事务。如果你不熟悉如何使用FragmentTransaction对象来改变Fragment,请阅读Fragment开发指南。

首先,你的布局必须包含一个用于放置跟每个Fragment对象关联的选项标签的ViewGroup对象。并且要确保这个ViewGroup对象有一个资源ID,以便你能够在选项标签的切换代码中能够引用它。另外,如果选项标签的内容填充在Activity的布局中(不包括操作栏),那么Activity不需要任何布局(你甚至不需要调用setContentView()方法)。相反,你能够把每个Fragment对象放到默认的根ViewGroup对象中,你能够用android.R.id.content ID来引用这个ViewGroup对象(在Fragment执行事务期间,你能够在下面的示例代码中看到如何使用这个ID的。

决定了Fragment对象在布局中的显示位置后,添加选项标签的基本过程如下:

1.实现ActionBar.TabListener接口。这个接口中回调方法会响应选项标签上的用户事件,以便你能够切换Fragment对象;

2.对于每个要添加的选项标签,都要实例化一个ActionBar.Tab对象,并且调用setTabListener()方法设置ActionBar.Tab对象的事件监听器。还可以用setText()或setIcon()方法来设置选项标签的标题或图标。

3.通过调用addTab()方法,把每个选项标签添加到操作栏。

在查看ActionBar.TabListener接口时,注意到回调方法只提供了被选择的ActionBar.Tab对象和执行Fragment对象事务的FragmentTransaction对象---没有说明任何有关Fragment切换的事。因此。你必须定义自己的每个ActionBar.Tab之间的关联,以及ActionBar.Tab所代表的适合的Fragment对象(为了执行合适的Fragment事务)。依赖你的设计,会有几种不同的方法来定义这种关联。在下面的例子中,ActionBar.TabListener接口的实现提供了一个构造器,这样每个新的选项标签都会使用它自己的监听器实例。每个监听器实例都定义了几个在对应Fragment对象上执行事务时必须的几个成员变量。

例如,以下示例是ActionBar.TabListener接口的一种实现,在这个实现中,每个选项标签都使用了它自己的监听器实例:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    /** Constructor used each time a new tab is created.
      * @param activity  The host Activity, used to instantiate the fragment
      * @param tag  The identifier tag for the fragment
      * @param clz  The fragment's Class, used to instantiate the fragment
      */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}

警告:针对每个回调中的Fragment事务,你都不必调用commit()方法---系统会调用这个方法,并且如果你自己调用了这个方法,有可能会抛出一个异常。你也不能把这些Fragment事务添加到回退堆栈中。

在这个例子中,当对应的选项标签被选择时,监听器只是简单的把一个Fragment对象附加(attach()方法)到Activity布局上---或者,如果没有实例化,就会创建这个Fragment对象,并且把它添加(add()方法)到布局中(android.R.id.content ViewGroup的一个子类),当这个选项标签解除选择时,对应的Fragment对象也会被解除与布局的依附关系。

ActionBar.TabListener的实现做了大量的工作,剩下的事情就是创建每个ActionBar.Tab对象并把它添加到ActionBar对象中,另外,你必须调用setNavigationMode(NAVIGATION_MODE_TABS)方法来让选项标签可见。如果选项标签的标题实际指示了当前的View对象,你也可以通过调用setDisplayShowTitleEnabled(false)方法来禁用Activity的标题。

例如,下面的代码使用上面定义的监听器在操作栏中添加了两个选项标签。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Notice that setContentView() is not used, because we use the root
    // android.R.id.content as the container for each fragment

    // setup action bar for tabs
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(false);

    Tab tab = actionBar.newTab()
            .setText(R.string.artist)
            .setTabListener(new TabListener<ArtistFragment>(
                    this, "artist", ArtistFragment.class));
    actionBar.addTab(tab);

    tab = actionBar.newTab()
        .setText(R.string.album)
        .setTabListener(new TabListener<AlbumFragment>(
                this, "album", AlbumFragment.class));
    actionBar.addTab(tab);
}

注意:以上有关ActionBar.TabListener的实现,只是几种可能的技术之一。在API Demos应用中你能够看到更多的这种样式。

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.html

如果Activity终止了,那么你应该保存当前选择的选项标签的状态,以便当用户再次返回时,你能够打开合适的选项标签。在保存状态的时刻,你能够用getSelectedNavigationIndex()方法查询当前的被选择的选项标签。这个方法返回被选择的选项标签的索引位置。

警告:保存每个Fragment所必须的状态是至关重要的,因为当用户用选项标签在Fragment对象间切换时,它会查看Fragment在离开时样子。

注意:在某些情况下,Android系统会把操作栏选项标签作为一个下拉列表来显示,以便确保操作栏的最优化显示。

添加下拉式导航

作为Activity内部的另一种导航(或过滤)模式,操作栏提供了内置的下拉列表。下拉列表能够提供Activity中内容的不同排序模式。

启用下拉式导航的基本过程如下:

1.创建一个给下拉提供可选项目的列表,以及描画列表项目时所使用的布局;

2.实现ActionBar.OnNavigationListener回调,在这个回调中定义当用户选择列表中一个项目时所发生的行为;

3.用setNavigationMode()方法该操作栏启用导航模式,如:

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

4.用setListNavigationCallbacks()方法给下拉列表设置回调方法,如:

actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

这个方法需要SpinnerAdapter和ActionBar.OnNavigationListener对象。

分享到:
评论

相关推荐

    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 Action Bar的布局

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

    android-actionbar-master.zip_android_android actionbar组件

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

    android-support-v7.jar

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

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

    Action Bar是Android系统中的一种UI组件,主要用在应用程序的顶部,用于展示应用的标识、提供导航以及常用操作。在Android 3.0(API级别11)及更高版本中,Action Bar是默认界面的一部分,但在早期版本如2.x(API...

    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 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系统中的一个关键组件,它提供了应用...

    android-support-v4-v7

    2. `Toolbar`:作为可定制的Action Bar,提供了高度自定义的导航栏功能。 3. `RecyclerView`:高效的列表视图,可以处理大量的数据项,并支持滚动优化和动画效果。 4. `CardView`和`Material Design Components`:...

Global site tag (gtag.js) - Google Analytics