操作栏:适用于较旧Android版本的最佳做法

时间:2011-09-08 23:58:01

标签: android user-interface navigation titlebar

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

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

enter image description here

也可以在GDCatalog应用程序中看到:

enter image description here

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

  • 它也必须适用于较旧的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_height="fill_parent"
        android:scaleType="center" />

    <ImageView
        android:layout_width="?attr/gdActionBarDividerWidth"
        android:layout_height="fill_parent"
        android:background="?attr/gdActionBarDividerDrawable" />

    <TextView
        style="?attr/gdActionBarTitleStyle"
        android:id="@+id/gd_action_bar_title"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        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可能是最好的吗?

提前多多感谢!

5 个答案:

答案 0 :(得分:14)

您可能想要结帐ActionBarSherlock。源代码可用here。它将让您了解它如何与片段一起使用。它会告诉你如何继续。

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

答案 1 :(得分:2)

我个人的偏好是使用AndroidBarSherlock。这是一个很好的包装,表现非常好。如果您想避免碎片,也可以使用Android-ActionBar。关于android-actionbar的唯一事情就是你必须在每个布局中添加动作栏。

答案 2 :(得分:2)

我所做的是添加一个名为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以下的测试,但我不明白为什么它不适用于以前的版本。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

<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_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/APP_ICON" />
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ff0000" android:text="APP_TITLE">
</merge>

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