Как добавить элементы непосредственно в FrameLayout по адресу android:id/content?

У меня были некоторые проблемы с пониманием иерархии представлений моего приложения/устройства (поскольку у меня возникли проблемы с заставкой моего приложения).

По сути, мое приложение представляет собой игру openGL ES 2.0 и имеет следующие элементы:

  • Вид заставки (это стандартный вид Android)
  • Вид основного приложения (это GLSurfaceView)
  • Ресурсы загружаются в фоновом режиме (в AsyncTask)

Все, что я делаю, это:

Создание макета

 layout = new RelativeLayout(this);
 layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

Добавление GLSurfaceView и экрана-заставки

 layout.addView(myGLView);
 layout.addView(splashscreen);  //loads resources on an AsyncTask

Удаление заставки

Когда все загружено и готово, я просто удаляю Splashscreen, чтобы показать GLSurfaceView под ним:

 layout.removeView(splashscreen);

При проверке иерархии представлений моего приложения я вижу следующее:

Просмотры моего приложения

введите здесь описание изображения

Просмотры других приложений

введите здесь описание изображения

Как видно из приведенного выше рисунка, в моем приложении есть RelativeLayout — макет, который я создаю в коде (см. выше). Затем он добавляется в FrameLayout с идентификатором ресурса android:id/content.

Я загрузил 3 приложения из Play Store и проверил их макеты, и все они имеют свои представления, перечисленные непосредственно под этим FrameLayout.

Мой вопрос заключается в том, что именно представляет собой этот FrameLayout и как я могу получить к нему доступ и добавить свои представления (основное приложение, рекламные баннеры, заставка) непосредственно в него?

Я осмотрелся, и ни одна из вещей, которые я прочитал, не ответила на мой вопрос.


person Zippy    schedule 16.01.2015    source источник


Ответы (1)


Это корневое представление активности, и его можно получить следующим образом:

FrameLayout frame = (FrameLayout) findViewById(android.R.id.content);
person Simas    schedule 16.01.2015
comment
Привет @ user3249477 - спасибо за это. Я не уверен, как добавлять элементы непосредственно к нему. Если я попытаюсь изменить «макет» в моем коде выше на FrameLayout и назначить его, как указано в вашем ответе, когда я запускаю свое приложение, я получаю «У указанного дочернего элемента уже есть родитель, вы должны вызвать removeView() на сначала родитель ребенка ' - есть идеи, что это значит? Я отлично работаю, если просто создаю свой макет, как я указал в своем первоначальном вопросе. Спасибо. - person Zippy; 17.01.2015
comment
@Zippy Представление, которое вы adding, должно быть без родителей, т. Е. Они должны быть созданы программно. - person Simas; 17.01.2015
comment
user3249477, 2 представления, которые я пытаюсь добавить, создаются программно: одно — «Вид» (заставка), а другое — «GLSurfaceView» (myGLView) — мой код вообще не использует XML, если вы это имеете в виду? Это все Ява. Кроме того, я предполагаю, что «без родителей» это означает, что я уже не добавлял их ни в какие другие макеты, которых у меня нет. Извините, если я неправильно понял - спасибо за вашу помощь - person Zippy; 17.01.2015
comment
@Zippy попробуйте добавить простой RelativeLayout с красным фоном. - person Simas; 17.01.2015
comment
Привет, @user3249477. У меня с этим был некоторый успех, странно то, что причиной этой ошибки был setContentView(layout); — правильно ли, что мне не нужно это вызывать? ?! Кажется странным. Но если я не назову это, все работает нормально, и моя иерархия представлений похожа на те другие приложения, которые я упомянул в своем первоначальном вопросе - ура. - person Zippy; 17.01.2015
comment
@Zippy Я бы не стал заморачиваться с этим. Xml делает вещи более ясными, поскольку код Java имеет тенденцию легко запутываться. Дополнительный макет не сильно повредит вам. - person Simas; 17.01.2015
comment
Что ж, мой относительный макет также был создан на Java! Нормально ли не использовать setContentView(); ? Единственная причина, по которой я это делал, заключалась в том, что я пытался решить некоторые проблемы, которые у меня были с моим Splashscreen, однако это не очень помогло. Мне просто было интересно узнать о setContentView. - person Zippy; 17.01.2015
comment
@Zippy из Activity.java source вы можете видеть, что setContentView не делает ничего особенного (ожидайте, возможно, его ActionBar). Его можно не использовать, если вы сами добавляете макет перед вызовом чего-то вроде findViewById. - person Simas; 17.01.2015