Панель действий: лучшая практика для старых версий Android

Я хотел бы иметь панель меню в верхней части моего приложения - так же, как 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, возможно, лучше?

Большое спасибо!

Ответы

Ответ 1

Возможно, вы захотите проверить ActionBarSherlock. Исходный код доступен здесь. Это даст вам представление о том, как он используется вместе с фрагментами. Это даст вам некоторое представление о том, как действовать.

Существует библиотека совместимости android, созданная Google для использования некоторого нового API, который они создали для сотовой связи на более низкой версии, такой как 1.5 и выше. Его можно найти в папке sdk для Android, например E:\Program Files\Android\android-sdk-windows\android-compatible\v4\android-support-v4.jar. Если у вас нет этой банки, вам нужно будет загрузить ее с помощью менеджера avd.

Ответ 2

Мое личное предпочтение - использовать AndroidBarSherlock. Это отличный пакет и работает очень хорошо. Если вы хотите избежать фрагментов, вы также можете использовать Android-ActionBar. Единственное, что нужно в Android-панели действий - это добавить панель действий к каждому из ваших макетов.

Ответ 3

Что я сделал, добавлен файл макета xml под названием titlebar.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);
    }
}

Вы можете подключить все кнопки в этом классе. Если вам нужны пользовательские обработчики кнопок, вы можете создавать методы набора в этом классе. Он держит его полностью в одном элементе управления.

Чтобы использовать его в любом XML файле, где я хочу включить этот заголовок, сделайте это так:

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

Это хорошо работает для моих целей, и оно совместимо с 2.1 и выше. Я не тестировал ниже 2.1, но я не понимаю, почему он не будет работать с предыдущими версиями.

Ответ 4

Google добавила поддержку ActionBars в более ранних версиях Android в последней Android Support Library (18). Вы должны использовать ActionBarActivity и включить библиотеку поддержки android.support.v7.appcompat. Он обеспечивает поддержку API 7 (2.1)

Ответ 5

Как просто создать файл макета 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, правильно?