Как создать общий макет XML Android для всех действий
У меня есть приложение, которое нуждается в тех же элементах [5 кнопок, действующих как вкладки] на каждом экране. Можно ли создать "базовый XML-макет", который имеет эти 5 кнопок, а затем все остальные XML-файлы расширяются из макета bas каким-то образом, чтобы мне не нужно было иметь несколько кнопок, которые в конечном итоге будут иметь одинаковую функциональность.
есть ли лучший подход к этой проблеме, который может поддерживаться API 9
3 ответов
создайте общий макет для базовой деятельности. а затем включите этот макет во все макеты, используя <include>
tagwhich вы хотите сделать то же самое.
после этого создайте одно абстрактное действие, а затем обработайте все щелчки кнопок и кода в этом действии, а затем расширьте это действие во всех других действиях, в которые вы включили базовый макет.
общие кнопки xml макет
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/tabhost_bg"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="3">
<Button
android:id="@+id/btnHome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bottom_btn_active"
android:layout_weight="1"
android:text="@string/label_home"
style="@style/bottom_tab_btn"/>
<Button
android:id="@+id/btnSetting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bottom_btn_active"
android:layout_weight="1"
android:text="@string/label_settings"
style="@style/bottom_tab_btn"/>
<Button
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bottom_btn_active"
android:layout_weight="1"
android:text="@string/label_more"
style="@style/bottom_tab_btn"/>
</LinearLayout>
вот XML-макет, в который вы можете включить выше XML-файл
<include
android:id="@+id/bottombar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
layout="@layout/bottom_bar" />
здесь android: layout_width и android: layout_height и макет являются обязательными атрибутами
теперь вот базовая активность, которая обрабатывает щелчок общих элементов управления
public abstract class BottomBar extends Activity implements OnClickListener {
protected Button btnHome;
Button btnSetting, btnMore;
private Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
}
protected void mappingWidgets() {
btnHome = (Button) findViewById(R.id.btnHome);
btnSetting = (Button) findViewById(R.id.btnSetting);
btnMore = (Button) findViewById(R.id.btnMore);
btnHome.setOnClickListener(this);
btnSetting.setOnClickListener(this);
btnMore.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == null)
throw new NullPointerException(
"You are refering null object. "
+ "Please check weather you had called super class method mappingWidgets() or not");
if (v == btnHome) {
} else if (v == btnSetting) {
}else if(v == btnMore) {
}
}
protected void handleBackgrounds(View v) {
if (v == btnHome) {
btnHome.setBackgroundResource(R.drawable.bottom_btn_hover);
btnSetting.setBackgroundResource(R.drawable.bottom_btn_active);
btnMore.setBackgroundResource(R.drawable.bottom_btn_active);
} else if (v == btnSetting) {
btnHome.setBackgroundResource(R.drawable.bottom_btn_active);
btnSetting.setBackgroundResource(R.drawable.bottom_btn_hover);
btnMore.setBackgroundResource(R.drawable.bottom_btn_active);
} else if (v == btnMore) {
btnHome.setBackgroundResource(R.drawable.bottom_btn_active);
btnSetting.setBackgroundResource(R.drawable.bottom_btn_active);
btnMore.setBackgroundResource(R.drawable.bottom_btn_hover);
}
}
}
теперь остается один шаг, чтобы расширить эту базовую деятельность во всех ваших действиях.
вы можете расширить базовое действие в действии, используя выходит ключевое слово. Например
public class MyActivity extends BottomBar
Примечание: из дочернего действия вы должны вызвать метод super базового класса для обработки щелчка общих элементов управления базового макета.
таким образом, вы можете реализовать несколько общих макетов в рамках одного действия.
надеюсь, это поможет вам. Наслаждайтесь!!
вы можете посмотреть в <include>
тег. он эффективно принимает xml, который вы создали и скопировать и вставляет его в другие макеты.
Итак, что бы вы сделали, это создать один макет с помощью кнопки. Поместите их между <merge>
тег, чтобы они не создавали FrameLayout
чтобы получить место. Затем положите использовать <include>
тег для использования того же макета в других макетах.
Примечание: всегда переопределить layout_width
и layout_height
атрибуты при использовании <include>
тег. это верно, даже если вы переопределяете их при одинаковых значениях. Существует ошибка в предыдущих версиях Android, где он будет игнорировать определенные атрибуты, если вы не переопределите эти атрибуты.
Includes было бы способом пойти,но я никогда не получал этого, чтобы работать надежно. Возможно, я делаю что-то неправильно, но компилятор не всегда подбирает идентификаторы в Объединенных макетах.