操作栏:旧 Android 版本的最佳实践

Posted

技术标签:

【中文标题】操作栏:旧 Android 版本的最佳实践【英文标题】:Action bar: Best practice for older Android versions 【发布时间】:2011-11-13 10:12:26 【问题描述】:

我想在我的应用程序顶部有一个菜单栏 - 就像 Facebook、Google+ 或 Twitter 一样:

这是来自 Twitter 应用程序的屏幕截图,其中显示了此栏:它显示在每个活动中,左侧有公司徽标(可点击),右侧有 1-3 个菜单项(可点击图片)。

在 GDDatalog 应用中也可以看到:

因此,该操作栏有一些要求:

它也必须在较旧的 android 平台上运行,例如 API 级别 8。 它必须在每个活动中都可用,而无需一次又一次地重复代码。 它必须适应屏幕尺寸才能占据整个宽度。

实施此类操作栏的最佳做法是什么?

GreenDroid 就是这样做的(使用合并):

<?xml version="1.0" encoding="utf-8"?>

<!--
/*
** Copyright (C) 2010 Cyril Mottier (http://www.cyrilmottier.com)
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->

<merge
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageButton
        xmlns:android="http://schemas.android.com/apk/res/android"
        style="?attr/gdActionBarItemStyle"
        android:id="@+id/gd_action_bar_item"
        android:layout_
        android:scaleType="center" />

    <ImageView
        android:layout_
        android:layout_
        android:background="?attr/gdActionBarDividerDrawable" />

    <TextView
        style="?attr/gdActionBarTitleStyle"
        android:id="@+id/gd_action_bar_title"
        android:layout_
        android:layout_
        android:layout_weight="1.0"
        android:gravity="left|center_vertical"
        android:singleLine="true"
        android:textColor="?attr/gdActionBarTitleColor"
        android:textSize="16sp"
        android:textStyle="bold"
        android:paddingRight="10dp"
        android:paddingLeft="10dp" />

</merge>

这是一个好的解决方案吗?它也适用于旧平台吗?这里还缺少哪些编码部分?

我知道我们可以在这里找到关于这些操作栏的几个问题。但是,尽管如此,我还是找不到在(几乎)所有 API 级别上实现菜单栏的最佳和最简单的方法。 Google's solution 是不是最好的?

提前非常感谢!

【问题讨论】:

最好和最简单的是主观的。你为什么不尝试一些东西,当你遇到特定问题时再回来。 “最佳实践”绝不是主观的。它始终是一些开发人员认为的最佳解决方案。如果我向这里的每个开发人员询问他或她喜欢的解决方案,我们就会知道什么是最好的解决方案。当然我不想知道有人喜欢哪种解决方案,我们都想知道原因和论据。我有一个特定的问题:我不知道应该如何实现该操作栏。 ;) 【参考方案1】:

您可能想查看ActionBarSherlock。源代码可用here。它将让您了解它是如何与片段一起使用的。它会给你一些关于如何进行的想法。

谷歌创建了一个 android 兼容性库,以使用他们为低版本(例如 1.5 及更高版本)上的蜂窝创建的一些新 API。它可以在 android sdk 文件夹中找到,例如 E:\Program Files\Android\android-sdk-windows\android-compatibility\v4\android-support-v4.jar。如果您没有此 jar,则需要使用 avd 管理器下载它。

【讨论】:

感谢您的建议!不幸的是,为了启用 ActionBarSherlock,您必须声明所有活动以扩展 FragmentActivity。但是我的活动都已经扩展了 ListActivity。因为我不能扩展两个类,所以我不能使用这个,可以吗? 有一个列表片段。您可能需要阅读一些片段教程。它是蜂窝带来的新概念。 好的,谢谢您的添加。但是 Fragments 仅从 API 级别 11 开始可用,不是吗?如何在 Android 2.2 或 2.3 上使用它? 要使用 ActionBarSherlock,您必须将所有 ListActivities 更改为包含 ListFragments 的 FragmentActivities。无论如何,从长远来看,这可能是一件好事,因为这将使您的应用在平板设备上的布局变得更加容易。 ActionBarSherlock 包括整个 Android 兼容性库以及 ActionBar 功能,这意味着您可以在任何版本的 Android 中使用 Fragments 和 Loaders 一直到 1.6(API 版本 4)。太棒了。 非常感谢您的评论,LouieGeetoo。如何声明我的活动以扩展包含 ListFragment 的 FragmentActivity?【参考方案2】:

我个人的偏好是使用 AndroidBarSherlock。这是一个出色的软件包,性能非常好。如果你想避免碎片,你也可以使用Android-ActionBar。关于 android-actionbar 唯一的事情是您必须将操作栏添加到您的每个布局中。

【讨论】:

非常感谢!这个库也非常有趣和有用。【参考方案3】:

我所做的是添加了一个名为 titlebar.xml 的 xml 布局文件,它看起来像:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" style="@style/FullWidth">
    <RelativeLayout style="@style/FullWidth">
        <ImageView style="@style/WrapContent" android:src="@drawable/mylogo" android:layout_centerVertical="true" android:id="@+id/imageViewIcon" />
        <TextView style="@style/Title" android:layout_toRightOf="@+id/imageViewIcon" android:layout_toLeftOf="@+id/buttonSomeButton" android:id="@+id/textViewAppName"  android:text="@string/appName"/>
        <TextView style="@style/SubTitle" android:text="@string/empty" android:layout_marginLeft="3dip" android:layout_toRightOf="@+id/imageViewIcon" android:layout_toLeftOf="@+id/buttonSomeButton" android:layout_below="@+id/textViewAppName" android:id="@+id/textViewSubtitle" />
        <Button style="@style/NormalButton" android:id="@+id/buttonSomeButton" android:drawableRight="@drawable/button_image" android:layout_centerVertical="true" android:layout_alignParentTop="true" android:layout_alignParentRight="true" />
    </RelativeLayout>
</merge>

然后我创建了一个扩展 LinearLayout 的控件,名为 TitleBar.java,看起来像:

package com.sample.ui;

public class TitleBar extends LinearLayout 
    public TitleBar(Context context, AttributeSet attrs) 
        super(context, attrs);    
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.titlebar, this);
    

你可以在这个类中连接所有的按钮。如果您需要自定义按钮处理程序,您可以在此类中创建 set 方法。它将所有内容都很好地包含在一个控件中。

要在我想要包含此标题栏的任何 XML 文件中使用它,可以这样做:

<com.sample.ui.TitleBar style="@style/FullWidth" />

这对我的目的很有效,并且与 2.1 及更高版本兼容。我没有测试过低于 2.1 的版本,但我不明白为什么它不适用于以前的版本。

【讨论】:

非常感谢 :) 您的布局 xml 文件包含 RelativeLayout 而您的 TitleBar.java 扩展 LinearLayout 是否正确? FullWidth 样式文件里面有什么? 其实我的Titlebar布局是使用RelativeLayout的,但它可以使用任何东西。这对我来说很方便,因为我想要一个标题和副标题都对齐的图像。至于样式,其实只是我用的一个捷径: 我有类似的 FillParent 和 WrapContent。这是我经常使用并且厌倦了一直打字的三种基本样式。他们是我许多其他风格的父母。【参考方案4】:

Google 在最新的Android Support Library (18) 中增加了对旧版 Android 上的 ActionBars 的支持。您必须使用 ActionBarActivity 并包含 android.support.v7.appcompat 支持库。它提供对 API 7 (2.1) 的支持

【讨论】:

谢谢!有什么理由让您从 ActionBarSherlock 切换到这个新的支持库? ActionBarSherlock 在支持库中具有超出 ActionBar 的附加功能。谷歌支持 ActionBar。在这个时间点,如果你有什么东西可以工作,那为什么要切换它。【参考方案5】:

如何简单地创建一个 XML 布局文件,例如“top_bar.xml”,包含在每个活动的布局中?

所以在每一个activity的布局文件中,你需要一个线性布局(垂直方向)作为父级,然后添加以下内容:

<include layout="@layout/custom_action_bar" android:id="@+id/action_bar" />

然后,您必须将自定义操作栏中所有项目的 onclick 侦听器添加到这些活动的源文件中。

布局文件“custom_action_bar.xml”可能如下所示:

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView android:layout_ android:layout_ android:src="@drawable/APP_ICON" />
    <TextView android:layout_ android:layout_ android:background="#ff0000" android:text="APP_TITLE">
</merge>

这不是一个简单的解决方案,但可能适用于所有 Android 平台版本,对吧?

【讨论】:

以上是关于操作栏:旧 Android 版本的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Android最佳实践之SystemBar状态栏全版本适配方案

Android最佳实践之SystemBar状态栏全版本适配方案

保留旧版本的 Git 最佳实践

在android中使用底部导航的最佳实践:活动与片段

使用 zend 框架创建动态侧边栏的最佳实践

FlutterComponent最佳实践之沉浸式