Разъяснение относительно setContentView - PullRequest
0 голосов
/ 08 апреля 2019

Какая разница между:

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text); 

И

TextView textView = new TextView(this);
setContentView(textView);

Я нашел эти две части кода.Во-первых, у setContentView есть информация о макете.И во втором случае это мнение передается в качестве аргумента.Является ли textView также id.Я думаю, что разница в том, что в первом случае это макет Activity_main, как описано в XML-файле (который также содержит textView), а во втором случае это id TextView.Скажи мне, если я прав.

Также скажите мне, что здесь означает «это».Почему мы используем findViewById в первом случае?

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

В первом коде,

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text); 

Вы устанавливаете представление содержимого контейнера, а затем пытаетесь получить доступ к представлению с ID-текстом.

Например:

<RelativeLayout android:height="match_parent"
android:width="match_parent">
<TextView
android:id="@+id/text" 
android:text="Hello"
android:height="wrap_content"
android:width="wrap_content"/>
</RelativeLayout>

В этом файле макета TextView имеет идентификатор - текст Итак, для программного доступа к textview мы используем findViewById () t, чтобы получить ссылку на представление.

TextView textView = findViewById(R.id.text);

теперь мы можем использовать эту ссылку на представление для внесения изменений в представление. Например, мы можем изменить текст как,

textView.setText("This is a test");

Насколько

TextView textView2 = new TextView(this);

обеспокоен тем, что вы создаете TextView динамически. Это может быть добавлено в родительский контейнер по мере необходимости.

1 голос
/ 08 апреля 2019

Activity.setContentView() имеет 2 подписи.Один принимает идентификатор макета в качестве параметра, другой принимает вид в качестве параметра.На самом деле есть третий, который принимает View и ViewGroup.LayoutParam в качестве входных данных.

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

Также см .: setContentView description

Затем строка TextView txtView = (TextView)findViewById(R.id.text); ищетTextView с идентификатором «text» в содержимом Activitys (в этом случае каждое представление в R.layout.activity_main).

Строка TextView textView = new TextView(this); создает новое TextView программно, а не раздувает макет xml.Параметр this является экземпляром Context.Экземпляр Context всегда необходим для создания View.Активность - это контекст.

0 голосов
/ 09 апреля 2019

Когда вы используете следующее:

setContentView(R.layout.activity_main);        
TextView txtView = (TextView)findViewById(R.id.text);

вы используете макет activity_main в качестве содержимого упражнения.всякий раз, когда вы пытаетесь связать вид с помощью findViewByid(), он ищет только виды внутри макета и выдаст ошибку, если вы попытаетесь связать виды вне макета.Подробнее см. setContentView (int layoutResID) .


Когда вы используете следующее:

TextView textView = new TextView(this);
setContentView(textView);

Вы создаете TextView с действием(это) как контекст с new TextView(this);.Обратите внимание, что вам всегда нужен контекст, когда вы создаете представление.

Затем с помощью setContentView(textView); вы устанавливаете textView в качестве единственного содержимого упражнения.Подробнее см. setContentView (представление View) .

...