Как использовать общий макет между действиями без фрагмента

Есть ли какой-либо возможный способ разделить макет (часть) между действиями? Например, в моем приложении все действия имеют аналогичный макет, верхняя часть - это индикатор продолжительной работы (индикатор выполнения, скрытый, когда никакая операция не выполняется), нижняя часть предназначена для отображения ошибок. Только средняя часть отличается от всех видов деятельности. См. Рисунок ниже.

enter image description here

поэтому мой вопрос: можно ли повторно использовать общий макет (часть загрузки и ошибки) для всех действий в моем приложении? (в настоящее время я не хочу использовать фрагмент, чтобы сделать это по некоторым причинам)

возможно, ресурсы макета должны понравиться:

layoutfolder

activity_common.xml

activity_one_content.xml

activity_two_content.xml

спасибо

Ответ 1

Вы можете создать абстрактную "базовую" активность, от которой распространяются все ваши действия, переопределяя setContentView для объединения базовых и макетов суб-операций.

Таким образом вы можете обрабатывать весь код загрузки/ошибки в базовом действии и просто переключаться между скрытием и отображением представлений в вспомогательных действиях.

Абстрактная активность:

public abstract class BaseActivity extends Activity {

    protected RelativeLayout fullLayout;
    protected FrameLayout subActivityContent;

    @Override
    public void setContentView(int layoutResID) {
        fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_base, null);  // The base layout
        subActivityContent = (FrameLayout) fullLayout.findViewById(R.id.content_frame);            // The frame layout where the activity content is placed.
        getLayoutInflater().inflate(layoutResID, subActivityContent, true);            // Places the activity layout inside the activity content frame.
        super.setContentView(fullLayout);                                                       // Sets the content view as the merged layouts.
    }

}

файл макета:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/loading_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/error_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

Ответ 2

Вы можете использовать include в XML, чтобы... включить повторно используемую часть вашего кода макета.

В качестве примера, здесь мой файл макета для Toolbar, который я использовал в своем приложении:

// /res/layout/component_toolbar.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:taggr="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primary"
    android:minHeight="?attr/actionBarSize"
    taggr:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    taggr:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

Теперь, скажем, если я хочу снова использовать этот Toolbar в другом Activity, это все, что мне нужно написать:

// /res/layout/whatever_layout_this_might_be.xml

<include layout="@layout/component_toolbar" />

Имейте в виду, что это только копирует макет, а не фактическое поведение указанного виджета/компонента.

Если вы хотите фактически скопировать все аспекты (макет, поведение), я боюсь, что Fragment - единственный способ пойти.

Ответ 3

Хотя ActivityGroup устарел из API 13, но если вы не хотите идти с фрагментами, это может быть вашим лучшим выбором.

Согласно документации, ActivityGroup:

Экран, содержащий и выполняющий несколько встроенных действий.

Вы можете найти учебник здесь и здесь Хотя упомянутый учебник использует Tablayout, вы можете заменить его на общий макет в XML.

Второй подход может быть Повторно использовать макет с тегом include, в этом подходе вы могли бы просто повторно использовать созданный вами общий макет повсюду в приложение.