Как создать общий макет 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 было бы способом пойти,но я никогда не получал этого, чтобы работать надежно. Возможно, я делаю что-то неправильно, но компилятор не всегда подбирает идентификаторы в Объединенных макетах.