Android программно включает в себя макет (т.е. без XML)

Поэтому я создал подкласс Activity под названием CustomTitlebarActivity. По сути, каждое основное действие в моем приложении будет иметь настраиваемый заголовок с множеством общих функций, таких как кнопка «Домой», заголовок, кнопка поиска и т. Д. В моей текущей реализации я все еще явно использую оператор include в XML-макете для Каждый CustomTitlebarActivity:

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

Кажется естественным, что я должен сделать это в CustomTitlebarActivity. У меня есть два вопроса: какой код может заменить этот тег include, и где я должен поместить код? (Моим первым инстинктом было бы поместить его в метод setContentView CustomTitlebarActivity.)

В соответствующей заметке я хотел бы получить представление о лучших способах повторного использования кода пользовательского интерфейса Android (даже если сам по себе заголовок должен немного варьироваться между действиями).

Solutions Collecting From Web of "Android программно включает в себя макет (т.е. без XML)"

Лично я бы, вероятно, написал подкласс 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 который возвращает идентификатор макета содержимого под заголовком для каждого подкласса; База onCreate() CustomTitlebarActivity затем просто вызовет

 setContentView(R.layout.custom_titlebar_activity_frame_from_above); View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container)); 

В качестве альтернативы, вы могли бы использовать свой абстрактный метод для получения области содержимого, а вместо него – представление, что дает вам большую гибкость для динамического построения ваших представлений (но заставляя вас раздувать их самостоятельно в простом «просто дампе этого формата XML здесь» ).

Я тоже встретился с этой проблемой, и я просто решил ее сейчас. Я думаю, что мое решение проще:

  1. Создать надуватель:

     LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); 
  2. Раздуть макет ребенка:

     View childLayout = inflater.inflate(R.layout.child, (ViewGroup) findViewById(R.id.child_id)); 
  3. Добавьте его в родительский:

     parentLayout.addView(childLayout); 

Это сделано, наслаждайся!