Как удалить динамически созданный edittext java
Перейти к содержимому

Как удалить динамически созданный edittext java

  • автор:

Динамическое создание EditText

Но это все детали. Зачем вам вообще создавать вручную EditText? не проще ли воспользоваться предназначенным для этого компонентом типа GridView?

Отслеживать
ответ дан 9 июл 2015 в 9:06
4,325 14 14 серебряных знаков 22 22 бронзовых знака

  • java
  • android
  • android-studio
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.5.3.8609

Как удалить динамически созданный edittext java

Элемент EditText является подклассом класса TextView . Он также представляет текстовое поле, но теперь уже с возможностью ввода и редактирования текста. Таким образом, в EditText мы можем использовать все те же возможности, что и в TextView.

Из тех атрибутов, что не рассматривались в теме про TextView, следует отметить атрибут android:hint . Он позволяет задать текст, который будет отображаться в качестве подсказки, если элемент EditText пуст. Кроме того, мы можем использовать атрибут android:inputType , который позволяет задать клавиатуру для ввода. В частности, среди его значений можно выделить следующие:

  • text : обычная клавиатура для ввода однострочного текста
  • textMultiLine : многострочное текстовое поле
  • textEmailAddress : обычная клавиатура, на которой присутствует символ @ , ориентирована на ввод email
  • textUri : обычная клавиатура, на которой присутствует символ / , ориентирована на ввод интернет-адресов
  • textPassword : клавиатура для ввода пароля
  • textCapWords : при вводе первый введенный символ слова представляет заглавную букву, остальные — строчные
  • number : числовая клавиатура
  • phone : клавиатура в стиле обычного телефона
  • date : клавиатура для ввода даты
  • time : клавиатура для ввода времени
  • datetime : клавиатура для ввода даты и времени

Первое поле здесь обычное однострочное, а второе — многострочное. Чтобы во втором поле текст выравнивался по верху, дополнительно устанавливается атрибут android:gravity=»top» .

EditText в Java и Android

Одной из возможностей элемента EditText также является возможность обработать введенные символы по мере ввода пользователя. Для этого определим в файле activity_main.xml следующую разметку:

Предполагается, что введенные в EditText символы тут же будут отображаться в элементе TextView. И для этого также изменим код MainActivity:

package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText editText = findViewById(R.id.editText); editText.addTextChangedListener(new TextWatcher() < public void afterTextChanged(Editable s) <>public void beforeTextChanged(CharSequence s, int start, int count, int after) < >public void onTextChanged(CharSequence s, int start, int before, int count) < TextView textView = findViewById(R.id.textView); textView.setText(s); >>); > >

С помощью метода addTextChangedListener() здесь к элементу EditText добавляется слушатель ввода текста — объект TextWatcher . Для его использования нам надо реализовать три метода, но в реальности нам хватит реализации метода onTextChanged , который вызывается при изменении текста. Введенный текст передается в этот метод в качестве параметра CharSequence. В самом методе просто передаем этот текст в элемент TextView.

В итоге при вводе в EditText все символы также будут отображаться в TextView:

Как удалить динамически созданный edittext java

После привязки ListView к источнику данных через адаптер мы можем работать с данными — добавлять, удалять, изменять только через адаптер. ListView служит только для отображения данных.

Для управления данными мы можем использовать методы адаптера или напрямую источника данных. Например, класс ArrayAdapter предоставляет следующие методы для управления данными:

  • void add(T object) : добавляет элемент object в конец массива
  • void addAll(T. items) : добавляет все элементы items в конец массива
  • void addAll(Collection collection) : добавляет коллекцию элементов collection в конец массива
  • void clear() : удаляет все элементы из списка
  • void insert(T object, int index) : добавляет элемент object в массив по индексу index
  • void remove(T object) : удаляет элемент object из массива

Однако после применения вышеуказанных методов изменения коснутся только массива, выступающего источником данных. Чтобы синхронизировать изменения с элементом ListView , надо вызвать у адаптера метод notifyDataSetChanged() .

Например, определим в файле activity_main.xml следующие элементы:

Для вывода списка предназначен ListView с возможностью множественного выбора элементов. Для добавления и удаления определены две кнопки. Для ввода нового объекта в список предназначено поле EditText.

Теперь изменим класс MainActivity :

package com.example.listapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import java.util.ArrayList; import java.util.Collections; public class MainActivity extends AppCompatActivity < ArrayListusers = new ArrayList(); ArrayList selectedUsers = new ArrayList(); ArrayAdapter adapter; ListView usersList; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // добавляем начальные элементы Collections.addAll(users, "Tom", "Bob", "Sam", "Alice"); // получаем элемент ListView usersList = findViewById(R.id.usersList); // создаем адаптер adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_multiple_choice, users); // устанавливаем для списка адаптер usersList.setAdapter(adapter); // обработка установки и снятия отметки в списке usersList.setOnItemClickListener(new AdapterView.OnItemClickListener()< @Override public void onItemClick(AdapterViewparent, View v, int position, long id) < // получаем нажатый элемент String user = adapter.getItem(position); if(usersList.isItemChecked(position)) selectedUsers.add(user); else selectedUsers.remove(user); >>); > public void add(View view) < EditText userName = findViewById(R.id.userName); String user = userName.getText().toString(); if(!user.isEmpty())< adapter.add(user); userName.setText(""); adapter.notifyDataSetChanged(); >> public void remove(View view) < // получаем и удаляем выделенные элементы for(int i=0; i< selectedUsers.size();i++)< adapter.remove(selectedUsers.get(i)); >// снимаем все ранее установленные отметки usersList.clearChoices(); // очищаем массив выбраных объектов selectedUsers.clear(); adapter.notifyDataSetChanged(); > >

С добавлением все относительно просто: получаем введенную строку и добавляем в список с помощью метода adapter.add() . Чтобы обновить ListView после добавления вызывается метод adapter.notifyDataSetChanged() .

А для удаления создается дополнительный список selectedUsers, который будет содержать выделенные элементы. Для получения выделенных элементов и добавления их в список используется слушатель AdapterView.OnItemClickListener , метод onItemClick() которого вызывается при установке или снятия отметки с элемента, то есть при любом нажатии на элемент.

По нажатию на кнопку удаления пробегаемся по списку выделенных элементов и вызываем для каждого из них метод adapter.remove() .

Урок 17. Создание View-компонент в рабочем приложении

На прошлом уроке мы создавали компоненты в методе Activity.onCreate, т.е. при создании приложения. На этом уроке будем создавать уже в работающем приложении. Создавать будем Button-ы, т.к. они наглядней всего отображаются. Будем указывать текст, который будет отображен на кнопке и выравнивание: слева, по центру или справа. Также предусмотрим возможность удаления созданных элементов.

Project name: P0171_DynamicLayout2
Build Target: Android 2.3.3
Application name: DynamicLayout2
Package name: ru.startandroid.develop.dynamiclayout2
Create Activity: MainActivity

Создадим экран, который поможет нам создавать View-компоненты. Открываем main.xml и пишем там следующее:

Рассмотрим подробно экран.

rgGravity – это RadioGroup, с тремя RadioButton (rbLeft, rbCenter, rbRight). Этот компонент мы используем для выбора выравнивания создаваемого компонента
etName – текстовое поле, здесь будем указывать текст, который будет отображаться на созданном компоненте
btnCreate – кнопка, запускающая процесс создания.
btnClear – кнопка, стирающая все, что создали
llMain – вертикальный LinearLayout, в котором будут создаваться компоненты

Экран готов, давайте кодить реализацию. Открываем MainActivity.java. Начнем с того, что опишем и найдем все необходимые нам компоненты. Кстати, у нас есть пара кнопок, которые мы будем использовать, значит им нужен обработчик. В качестве обработчика назначим Activity (т.е. необходимо дописать: implements OnClickListener) и создадим пустой пока метод обработки onClick:

public class MainActivity extends Activity implements OnClickListener < LinearLayout llMain; RadioGroup rgGravity; EditText etName; Button btnCreate; Button btnClear; int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); llMain = (LinearLayout) findViewById(R.id.llMain); rgGravity = (RadioGroup) findViewById(R.id.rgGravity); etName = (EditText) findViewById(R.id.etName); btnCreate = (Button) findViewById(R.id.btnCreate); btnCreate.setOnClickListener(this); btnClear = (Button) findViewById(R.id.btnClear); btnClear.setOnClickListener(this); >@Override public void onClick(View v) < // TODO Auto-generated method stub >>

Я также создал переменную wrapContent и буду хранить в ней значение LinearLayout.LayoutParams.WRAP_CONTENT. Делаю это только для снижения громоздкости кода.

Теперь опишем процесс создания Button-компонента заполнив метод onClick:

@Override public void onClick(View v) < switch (v.getId()) < case R.id.btnCreate: // Создание LayoutParams c шириной и высотой по содержимому LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams( wrapContent, wrapContent); // переменная для хранения значения выравнивания // по умолчанию пусть будет LEFT int btnGravity = Gravity.LEFT; // определяем, какой RadioButton "чекнут" и // соответственно заполняем btnGravity switch (rgGravity.getCheckedRadioButtonId()) < case R.id.rbLeft: btnGravity = Gravity.LEFT; break; case R.id.rbCenter: btnGravity = Gravity.CENTER_HORIZONTAL; break; case R.id.rbRight: btnGravity = Gravity.RIGHT; break; >// переносим полученное значение выравнивания в LayoutParams lParams.gravity = btnGravity; // создаем Button, пишем текст и добавляем в LinearLayout Button btnNew = new Button(this); btnNew.setText(etName.getText().toString()); llMain.addView(btnNew, lParams); break; > >

Разберем написанное. Для начала мы проверяем, что была нажата кнопка btnCreate – т.е. кнопка создания. Затем создаем LayoutParams с высотой и шириной по содержанию. Здесь я использовал переменную, про которую писал выше – wrapContent. Иначе получилось бы довольно громоздко.

Далее создаем переменную btnGravity, в которую по умолчанию запишем значение выравнивания LEFT. Для определения, какой RadioButton выделен в данный момент, используем метод getCheckedRadioButtonId – он для RadioGroup возвращает ID «чекнутого» RadioButton-а. Мы его сравниваем с нашими тремя ID и заносим соответствующее значение в переменную btnGravity. Скидываем это значение в gravity у LayoutParams.

Далее создаем кнопку и присваиваем ей текст из etName. Обратите внимание, что недостаточно написать getText, т.к. это не даст текста. Необходимо еще вызвать метод toString. Ну и в конце добавляем созданный Button в наш LinearLayout.

Сохраним все и запустим приложение. Добавим несколько кнопок.

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

Когда вводите текст, снизу появляется клавиатура и закрывает обзор. Чтобы она исчезла, надо нажать кнопку Back (Назад) на эмуляторе или ESC на обычной клавиатуре. Если клавиатура появляется японская с иероглифами, вызовите контекстное меню для поля ввода (долгое нажатие левой кнопкой мыши), нажмите Input method и выберите из списка Android Keyboard.

Осталось нереализованной кнопка Clear, которая призвана удалять все созданное. Для этого нам необходимо дополнить метод onClick, добавим в switch ( v.getId ()) еще один case:

case R.id.btnClear: llMain.removeAllViews(); Toast.makeText(this, "Удалено", Toast.LENGTH_SHORT).show(); break;

Метод removeAllViews удаляет все дочерние View-компоненты с нашего LinearLayout. С помощью Toast выводим на экран сообщение об успехе. Сохраним, запустим и проверим. Добавляем несколько кнопок, жмем кнопку Clear и наблюдаем результат:

В итоге у нас получилось очень даже динамическое приложение, которое умеет менять само себя.

На форуме задают вопрос: как потом получить доступ к этим созданным компонентам. Тут есть пара простых вариантов.

1) При создании вы можете сами присваивать компонентам ID. Это делается методом setId . И потом по этим ID просто вызываете findViewById.

2) Вы можете сохранять созданные компоненты в свой массив или список. Либо можете воспользоваться методом getChildAt. Вызов этого метода для llMain позволит получить его дочерние компоненты по индексу. Получить кол-во дочерних элементов позволит метод getChildCount.

Полный код урока:

public class MainActivity extends Activity implements OnClickListener < LinearLayout llMain; RadioGroup rgGravity; EditText etName; Button btnCreate; Button btnClear; int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); llMain = (LinearLayout) findViewById(R.id.llMain); rgGravity = (RadioGroup) findViewById(R.id.rgGravity); etName = (EditText) findViewById(R.id.etName); btnCreate = (Button) findViewById(R.id.btnCreate); btnCreate.setOnClickListener(this); btnClear = (Button) findViewById(R.id.btnClear); btnClear.setOnClickListener(this); >@Override public void onClick(View v) < switch (v.getId()) < case R.id.btnCreate: // Создание LayoutParams c шириной и высотой по содержимому LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams( wrapContent, wrapContent); // переменная для хранения значения выравнивания // по умолчанию пусть будет LEFT int btnGravity = Gravity.LEFT; // определяем, какой RadioButton "чекнут" и // соответственно заполняем btnGravity switch (rgGravity.getCheckedRadioButtonId()) < case R.id.rbLeft: btnGravity = Gravity.LEFT; break; case R.id.rbCenter: btnGravity = Gravity.CENTER_HORIZONTAL; break; case R.id.rbRight: btnGravity = Gravity.RIGHT; break; >// переносим полученное значение выравнивания в LayoutParams lParams.gravity = btnGravity; // создаем Button, пишем текст и добавляем в LinearLayout Button btnNew = new Button(this); btnNew.setText(etName.getText().toString()); llMain.addView(btnNew, lParams); break; case R.id.btnClear: llMain.removeAllViews(); Toast.makeText(this, "Удалено", Toast.LENGTH_SHORT).show(); break; > > >

На следующем уроке:

— изменяем layout-параметры для уже существующих компонентов экрана

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

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

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