Как использовать общий макет между действиями без фрагмента
Есть ли какой-либо возможный способ разделить макет (часть) между действиями? Например, в моем приложении все действия имеют аналогичный макет, верхняя часть - это индикатор продолжительной работы (индикатор выполнения, скрытый, когда никакая операция не выполняется), нижняя часть предназначена для отображения ошибок. Только средняя часть отличается от всех видов деятельности. См. Рисунок ниже.
![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, в этом подходе вы могли бы просто повторно использовать созданный вами общий макет повсюду в приложение.