Шаг 2. Деятельность(activity), контейнеры, виды

Шаг 2. Деятельность(activity), контейнеры, виды

Сообщение EgorovAD MEPhI » 26 ноя 2012, 19:28

В деятельности пишется строка:
Код: выделить все
setContentView(R.layout.main);

где
    main – имя созданного XML-файла,
    layout – папка, в которой данный шаблон располагается.

Если поместить файл шаблона в другую папку, например в папку values, то появится сообщение об ошибке и будет невозможно собрать проект.

Листинг 4
Код: выделить все
import android.app.Activity;
import android.os.Bundle;

public class MainAct extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


Добавим еще один элемент управления Button в шаблон из листинга 2, а также некоторые свойства уже имеющимся элементам (листинг 5).

Листинг 5
Код: выделить все
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
   
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_text"
    />

</LinearLayout>


Запустим программу. На экране увидим то, что изображено на рис. 2.2.

Изображение
Рис. 2.2. Внешний вид программы при применении шаблона с кодом из листинга 5

android:id – тот самый атрибут, который позволяет работать с нашим элементом управления в коде. Все добавленные id хранятся в файле R.java, он создается в папке YOUR_PROJECT_NAME/gen/YOUR_PACKAGE_NAME и модифицируется автоматически, вручную что-либо в нем менять не рекомендуется.
Знак “плюс” означает, что добавляется новый id. Если хотим работать с уже существующим id, а не добавлять новый, то знак “плюс” не ставим.
EgorovAD MEPhI
Администратор
 
Сообщений: 155
Зарегистрирован: 04 ноя 2011, 11:49

Шаг 2.Деятельность(activity), контейнеры, виды

Сообщение EgorovAD MEPhI » 26 ноя 2012, 19:33

Работать с уже имеющимися id придется при применении RelativeLayout.
RelativeLayout подразумевает, что каждый входящий в него элемент управления располагается в определенном месте относительно другого входящего в данный RelativeLayout элемента и/или относительно самого RelativeLayout.

Замените ваш код из main.xml на код из листинга 6.

Листинг 6
Код: выделить все
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
   
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
   
       <Button
           android:id="@+id/btn"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/first_btn_text"
       />
      
       <Button
           android:id="@+id/btn2"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/second_btn_text"
           android:layout_below="@id/btn"
           android:layout_alignParentRight="true"
       />
   </RelativeLayout>

</LinearLayout>

Запустим программу и увидим на экране то, что изображено на рис. 2.3.

Изображение
Рис. 2.3. Внешний вид программы при использовании RelativeLayout

android:layout_below="@id/btn" – кнопка с надписью “Second button” располагается ниже кнопки, id которой равно btn.
Здесь и далее первой будем называть кнопку с id, равным btn, а второй – с id, равным btn2.
Если убрать это свойство, то вторая кнопка прижмется вправо, а по высоте будет находиться на одном уровне с первой (рис. 2.4).

Изображение
Расположение второй кнопки без свойства android:layout_below="@id/btn"

ВНИМАНИЕ!
Если необходимо расположить несколько кнопок в ряд, то это делается через свойство android:layout_weight. Пример с расположением в ряд будет рассмотрен ниже.
android:layout_alignParentRight="true" – кнопка прижимается к правому краю родительского контейнера – RelativeLayout.
Если убрать это свойство, а кнопке с id, равным btn, поставить ширину вида, равную ширине родителя (свойство android:layout_width=”match_parent”), то увидим, что вторая кнопка легла прямо на первую (рис. 2.5).
В этом суть RelativeLayout: он требует указания расположения входящих в него видов и контейнеров.

Изображение
Рис. 2.5. Расположение второй кнопки без свойств android:layout_below="@id/btn" и android:layout_alignParentRight="true" и применение android:layout_width=”match_parent” для первой кнопки
EgorovAD MEPhI
Администратор
 
Сообщений: 155
Зарегистрирован: 04 ноя 2011, 11:49

Шаг 2. Деятельность(activity), контейнеры, виды

Сообщение EgorovAD MEPhI » 26 ноя 2012, 19:34

Теперь покажем работу в коде с элементами TextView и Button (листинг 7). Перед этим вернем в main.xml код из листинга 5.

Листинг 7

Код: выделить все
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainAct extends Activity implements OnClickListener {
   
    private Button but; // Объявляем but - объект класса Button как поле класса, так как будем работать с ним в двух методах: onCreate и onClick.
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        but = (Button) findViewById(R.id.btn); // Связываем переменную but с объявленным в шаблоне main.xml видом при помощи id.
        but.setOnClickListener(this); // Ставим, чтобы при клике по кнопке вызывался метод onClick, который следует сразу за методом onCreate.
       
    }

    @Override
    public void onClick(View v) {
       TextView tv = (TextView) findViewById(R.id.tv_id); // Связываем объект tv класса TextView с объявленным в main.xml
     
       // Ставим, чтобы по клику на кнопку текст в TextView менялся на другой.
       if (tv.getText().toString().equals("Hello World, MainAct!"))
           tv.setText("I have just changed this text");
       else // Если текст изменился на другой, то снова возвращаем на первый, обеспечивая тем самым изменение то с "Hello World, MainAct!" на "I have just changed this text", то наоборот.
           tv.setText("Hello World, MainAct!");
    }
}


Здесь созданы экземпляры классов Button и TextView связанные их с элементами из main.xml при помощи id. При нажатии на кнопку текст будет меняться каждый раз.
EgorovAD MEPhI
Администратор
 
Сообщений: 155
Зарегистрирован: 04 ноя 2011, 11:49

Шаг 2. Деятельность(activity), контейнеры, виды

Сообщение EgorovAD MEPhI » 26 ноя 2012, 19:49

Вернемся к нерассмотренным вопросам: к программному добавлению виджетов и свойству android:layout_weight.
Добавим свойство android:layout_weight, которое определяет ту долю пространства, которую занимает элемент управления в пространстве родителя. Как раз оно и используется для расположения кнопок в ряд, о чем упоминалось при рассмотрении RelativeLayout. Изменим имеющийся XML-файл (листинг 8).

Листинг 8
Код: выделить все
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
   
    <LinearLayout

        android:id="@+id/ll_external"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
       
        <Button
              android:id="@+id/btn"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="0.5"
                android:text="@string/add_view"
          />
       
          <Button
              android:id="@+id/btn2"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_weight="0.5"
              android:text="@string/change_text"
          />
       
    </LinearLayout>
   
</LinearLayout>


Имея TextView, располагающийся в корневом контейнере LinearLayout, мы обернули две кнопки в LinearLayout, поставили ему id, так как будем работать с ним в коде – добавлять в него виды программно.

Поставили каждой кнопке android:layout_width=”match_parent”.
Это означает, что каждая кнопка готова занять всю ширину контейнера, в котором она располагается, кнопки «конкурируют» за место в родительском LinearLayout.
Долю, которую получает каждый вид в родителе, и определяет свойство android:layout_weight.

Значением данного свойства может быть любое положительное вещественное число. Следите за их соотношением. Например, если поставить одному элементу 100.5, а другому 3.5, то второму почти не достанется места.
EgorovAD MEPhI
Администратор
 
Сообщений: 155
Зарегистрирован: 04 ноя 2011, 11:49

Re: Шаг 2. Деятельность(activity), контейнеры,

Сообщение EgorovAD MEPhI » 26 ноя 2012, 19:52

Добавим в деятельность возможность работать со второй кнопкой, а также метод для программного добавления виджетов (листинг 9).
Листинг 9
Код: выделить все
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainAct extends Activity implements OnClickListener {
   
    private Button but, but2;
    private LinearLayout ll;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       ll = (LinearLayout) findViewById(R.id.ll_external); // Обозначили контейнер, в который хотим программно добавить вид.
       
       but = (Button) findViewById(R.id.btn);
       but.setOnClickListener(this);
       but2 = (Button) findViewById(R.id.btn2);
       but2.setOnClickListener(this);
       
    }

    @Override
    public void onClick(View v) {
       switch (v.getId()) {
       case R.id.btn:
          addTextView();
          break;
       case R.id.btn2:
          changeText();
          break;
       }
    }
   
    private void changeText() {
       TextView tv = (TextView) findViewById(R.id.tv_id);
       
        if (tv.getText().toString().equalsIgnoreCase("Hello World, MainAct!"))
            tv.setText("I have just changed this text");
        else
            tv.setText("Hello World, MainAct!");
    }
   
    private void addTextView() {
       TextView tv2 = new TextView(this); // Объявляем вид, который хотим добавить.
       tv2.setText("I have just been added"); // Устанавливаем текст добавляемого вида TextView.
       ll.addView(tv2); // Добавляем в контейнер, который обозначали в методе onCreate() вид tv2.
    }
}


    switch (v.getId()) – очень удобный способ организовать работу нескольких кнопок в рамках одной деятельности. id каждого вида представляет собой целое число.

    Метод v.getId() вернет id нажатой кнопки.

    При нажатии будет вызываться метод onClick(), а потом будет выбрано одно из действий согласно тому id, который соответствует нажатой кнопке.

    Для кнопки, id которой поставлен как btn, будет выполнен вызов метода addTextView().

    Для кнопки, id которой поставлен как btn2, вызовется changeText().

Зачем при использовании кнопок действия, совершаемые по их нажатию, вынесены в отдельные методы changeText() и addTextView()?
Чтобы не загромождать метод onClick(). Представьте, что у вас будет не две, а три или четыре кнопки, а действия, совершаемые по их нажатию, будут сложнее, чем программное добавление видов и смена текста.

Программное добавление видов делается очень просто, посмотрите комментарии к коду в листинге 9. Не только setText(), но и многие другие методы можно применить к видам; например, расставить отступы при помощи
tv2.setPadding(10, 10, 10, 10);
Посмотрим на то, что получилось (рис. 2.6).

Изображение
Рис. 2.6. Две кнопки, получившие равные права на место в контейнере, и программное добавление видов.

Помните, что программное добавление виджетов показано для примера и применяется только в исключительных случаях.
Что делать, если нужно добавить много виджетов или контейнеров, имеющих одинаковые свойства? Код дублировать не нужно, для этого существуют стили.
EgorovAD MEPhI
Администратор
 
Сообщений: 155
Зарегистрирован: 04 ноя 2011, 11:49


Вернуться в 1. Пользовательский интерфейс и элементы управления приложения Android

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2