Android программно включает макет (т.е. без XML) - PullRequest
35 голосов
/ 07 июля 2010

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

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

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

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

Ответы [ 2 ]

59 голосов
/ 29 августа 2012

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

  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);
    

Готово, наслаждайтесь!

18 голосов
/ 07 июля 2010

Лично я, вероятно, записал бы свой 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() из CustomTitlebarActivity будет тогда просто вызывать

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

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

...