Панель действий: лучшая практика для старых версий 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, правильно?