Android программно включает в себя макет (т.е. Без XML)
Итак, я создал подкласс Activity под названием CustomTitlebarActivity. По сути, каждое основное действие в моем приложении будет иметь настраиваемый заголовок с множеством общих функций, таких как кнопка "Домой", название, кнопка поиска и т.д. В моей текущей реализации я все еще явно использую оператор include в XML-макете для каждый CustomTitlebarActivity:
<include layout="@layout/titlebar" />
Кажется естественным, что я должен сделать это в CustomTitlebarActivity. У меня есть два вопроса: какой код может заменить этот тег include, и где я должен поместить код? (Моим первым инстинктом было бы поместить его в метод CustomTitlebarActivity setContentView.)
В соответствующей заметке я хотел бы получить представление о лучших способах повторного использования кода пользовательского интерфейса Android (даже если, по сути, заголовки должны немного различаться между действиями.)
Ответы
Ответ 1
Лично я бы, вероятно, написал подкласс Activity
всегда setContentView
к файлу макета, содержащему вертикальный fill_parent
LinearLayout
, содержащий только мою строку заголовка: -
<LinearLayout android:id="@+id/custom_titlebar_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--titlebar here-->
</LinearLayout>
Затем я бы определил абстрактный getContentAreaLayoutId()
метод в CustomTitlebarActivity
, который возвращает макет ID
содержимого под заголовком для каждого подкласса; база onCreate()
of CustomTitlebarActivity
затем просто вызовет
setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));
В качестве альтернативы вы можете использовать свой абстрактный метод для получения области содержимого View
, а не int
, что дает вам больше гибкости для динамического построения ваших представлений (но заставляя вас раздувать их самостоятельно в простой дампе этот XML-макет здесь case).
Ответ 2
Я тоже встречался с этой проблемой, и я просто решил ее сейчас. Я думаю, что мое решение проще:
-
создать раздуватель:
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
-
раздуйте дочерний макет:
View childLayout = inflater.inflate(R.layout.child,
(ViewGroup) findViewById(R.id.child_id));
-
добавить его в родительский:
parentLayout.addView(childLayout);
Сделано, наслаждайся!