Когда макет не объявляется явным, что является макетом по умолчанию для Activity? - PullRequest
2 голосов
/ 22 января 2012

Я написал простое приложение Hello World с одним Activity.

Класс:

public class HelloWorld extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.helloworld);
    }

}

helloworld.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>

Мне нужны ресурсыи «AndroidManifest.xml» на месте, приложение работает нормально.

В «Окне просмотра иерархии» инструмента «имя пользователя иерархии» я заметил, что родителем виджета TextView является FrameLayout, родительским объектом которого является LinearLayout (для краткости явырезал только необходимый снимок экрана).Снимок экрана:

View Hierarchy window's screen shot

В моем файле helloworld.xml я не объявил FrameLayout в качестве родителя для виджета TextView.Пожалуйста, помогите мне понять:
1. В общем, как среда выполнения определяет макет, если он явно не объявлен в ресурсе макета (XML-файл)?
2. Почему на диаграмме LinearLayout является родителем FrameLayout?

Большое спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

С помощью подсказки по ссылке, опубликованной Викрамом Бодичерлой, и некоторыми усилиями я нашел ответы на свои вопросы.Ответы на мои вопросы находятся в выпуске Android 3.0 - «когда приложение установлено на устройстве под управлением Android 3.0 или выше, система применяет голографическую тему к каждому действию, и, таким образом, каждое действие включает в себя панель действий». Из документации.

1 В общем, как среда выполнения определяет макет, если он явно не объявлен в ресурсе макета (XML-файл)?- См. Ответ ниже.

2 На диаграмме, почему LinearLayout является родителем FrameLayout?- LineraLayout делит пользовательский интерфейс на два раздела - верхний и нижний, которые представляют ActionBar и пользовательский интерфейс действия (компоненты, отличные от компонентов ActionBar) соответственно.Нижний раздел имеет FrameLayout, который является подходящим макетом для размещения любого макета.Таким образом, если вы не укажете явно какой-либо макет в своем ресурсе макета, таком как мой (см. Выше - helloworld.xml), компоненты всегда будут размещены в FrameLayout.Если вы объявите ЛЮБОЙ макет, скажем, GridLayout или даже LinearLayout или FrameLayout, он все равно будет включен в FrameLayout, который будет включен в LinearLayout.Это также объясняет, почему «... родителем представления содержимого действия всегда является FrameLayout».по ссылке, опубликованной Викрамом Бодичерлой.

@ Викрам Бодичерла - Я дал балл за вашу ссылку, еще раз спасибо.

0 голосов
/ 22 января 2012

Если установленное представление содержимого не вызывается, тогда ВСЕ представления, найденные в R.java, будут нулевыми.В частности, это потому, что представления не создаются до тех пор, пока не будет вызван setContentView (xx).Не существует «макета по умолчанию».

Это параметры, доступные для настройки макета в Activity:

void     setContentView(int layoutResID)
Set the activity content from a layout resource.

void     setContentView(View view)
Set the activity content to an explicit view.

void     setContentView(View view, ViewGroup.LayoutParams params)
Set the activity content to an explicit view.

После вызова одного из этих методов высоздавать экземпляры ваших представлений о вашей деятельности, поэтому при извлечении их из R.java они будут ненулевыми.

...