Программное добавление элементов View в layout

| 30.05.2014

Описание структуры экрана в xml — удобный и рекомендуемый способ при создании layout. Однако, иногда возникает задача добавить какие-то элементы, например, кнопки или текстовые поля в layout программно, а затем получить к ним доступ для обработки событий или извлечения введеной пользователем информации. Как это делать — вы узнаете из примера ниже.

Задача: в имеющийся layout добавить 5 элементов EditText и 5 кнопок Button. Каждая кнопка располагается под одним текстовым полем, т.е., по сути, мы имеем 5 пар «EditText — Button». При нажатии на кнопку в всплывающем сообщении должен отобразиться текст из соответствующего кнопке EditText. Каждой кнопке мы присвоим id от 0 до 4, что позволит нам потом выбирать нужный EditText.

Итак, вот исходный layout.

res/layout/activity_main.xml

1
2
3
4
5
6
7
8
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
</LinearLayout>

Здесь лишь описание типа layout — LinearLayout. Важно задать id для этого layout. Здесь это — «container».

Всю логику помещаем в MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package ru.androiddocs.programview;
 
import java.util.ArrayList;
import java.util.List;
 
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity {
 
    LinearLayout llt;	
    private List<EditText> editTextList = new ArrayList<EditText>();
    OnClickListener getEditText;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        llt = (LinearLayout) findViewById(R.id.container);
        //layout params for every EditText
        LinearLayout.LayoutParams lEditParams = new LinearLayout.LayoutParams(
            100, LinearLayout.LayoutParams.WRAP_CONTENT);
        //layout params for every Button
        LinearLayout.LayoutParams lButtonParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT);
 
        getEditText = new OnClickListener() {
            @Override
            public void onClick(View v) {
                int editId = v.getId();		    	   
                EditText currEditTxt = editTextList.get(editId);
 
                Toast toast = Toast.makeText(getApplicationContext(), 
                    currEditTxt.getText().toString(), Toast.LENGTH_SHORT);
                toast.show();
 
            }
        };
 
        for (int i = 0; i < 5; i++) {
            EditText  editTxt = new EditText(this);            
            editTxt.setLayoutParams(lEditParams);                      
            editTextList.add(i, editTxt);
            llt.addView(editTxt);
 
            Button btn =  new Button(this);
            btn.setLayoutParams(lButtonParams);
            btn.setId(i);
            btn.setOnClickListener(getEditText);
            btn.setText("click!");
            llt.addView(btn);            
        }		
    }	
}

Несколько комментариев. Первоначально мы инициализируем и находим наш layout по id. Определяем параметры (ширину и высоту) для элементов EditText и Button, которые мы затем создаем в цикле. Обратите внимание, что для EditText мы прописали ширину не через константу LinearLayout.LayoutParams.WRAP_CONTENT, а непосредственно числом (100). Ширина и высота кнопки будут соответствовать контенту — «wrap_content».

В цикле for мы создаем элементы EditText и помещаем их в коллекцию editTextList с индексом, соответствующим итерации цикла и id кнопки, которая создается на этом же шаге. С помощью метода addView() мы добавляем создаваемые элементы в layout. Каждой кнопке мы добавляем id с помощью метода setId().

Новые элемент создаются как экземпляры классов с ключевым словом new, например:

1
EditText  editTxt = new EditText(this);

getEditText — это обработчик клика по кнопке. Здесь мы определяем id кнопки и достаем из коллекции по этому id (ключу в коллекции) нужный элемент EditText. Затем получаем из EditText введенный текст и выводим его с помощью сообщений Toast.

Программное добавление элементов View в layout

У МТС услуга Вам звонили становится платной http://mts-smart.ru/ - Традиционная подборка свежих изменений.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*