Добавить и удалить вид из макета

94

Как я могу добавить и удалить представление из макета?

чиранджиб
источник
какой макет? не могли бы вы вставить часть кода, над которым вы работаете?
Кристиан
3
Как это хорошо подготовлено?
Корнелиус

Ответы:

219

Я сделал это так:

((ViewManager)entry.getParent()).removeView(entry);
Натан Шверманн
источник
45
В новых SDK это (ViewGroup):)
Рон,
@schwiz, как мы можем сбросить идентификатор представления в этом случае. Моя проблема заключается в том, что даже после завершения моей деятельности, когда добавляется следующее представление, идентификатор представления увеличивается. Я хочу, чтобы идентификатор представления по умолчанию был равен 1, когда я снова вернусь к этому действию .
AndroidNewBee
Большое спасибо за этот ответ дал
рубчик
ViewGroup расширяет View реализует ViewParent, ViewManager. лучше назвать это кастингом на (ViewGroup)
Mercury
24

Используйте ViewStub и укажите макет представления, которое вы хотите переключить. Смотреть:

mViewStub.setVisibility(View.VISIBLE) or mViewStub.inflate();

Чтобы исчезнуть:

mViewStub.setVisibility(View.GONE);
Самир Сигал
источник
40
Скрытие - это не то же самое, что удаление.
Darkwater
Если вы хотите скрыть / показать, вы можете использовать .setVisibility (View.INVISIBLE) и .setVisibility (View.VISIBLE). Когда представление невидимо, пользователь не может с ним взаимодействовать.
dennisschagt
Скажем, у меня есть textView с прикрепленным к нему onClickListener. Если я заставлю его исчезнуть, а затем нажму на него, событие все равно сработает?
ahitt6345 04
22

Это лучший способ

LinearLayout lp = new LinearLayout(this);
lp.addView(new Button(this));
lp.addView(new ImageButton(this));
// Now remove them 
lp.removeViewAt(0); // and so on

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

lp.removeViewAt(0);
Тофик Ахмад
источник
Какая разница в производительности? Я имею в виду разницу в производительности при их динамическом добавлении или помещении в статический файл макета xml и позволять ему надуваться?
stdout
19

Чтобы добавить представление в макет, вы можете использовать addViewметод ViewGroupкласса. Например,

TextView view = new TextView(getActivity());
view.setText("Hello World");

ViewGroup Layout = (LinearLayout) getActivity().findViewById(R.id.my_layout);
layout.addView(view); 

Также существует ряд методов удаления. Проверьте документацию ViewGroup . Один простой способ удалить представление из макета может выглядеть так:

layout.removeAllViews(); // then you will end up having a clean fresh layout
Абель Терефе
источник
4
removeAllViews () - это то, что я искал!
Алан
6

Для изменения видимости:

predictbtn.setVisibility(View.INVISIBLE);

Для удаления:

predictbtn.setVisibility(View.GONE);
Амин Маин
источник
Он устранил мою проблему больше, чем любой другой ответ. Полезно, если, как и я, ваш фон или некоторые параметры предотвращают полное исчезновение представления.
Виртус
1
это потому, что View.GONE не удаляет представление для макета, а только делает его невидимым и не занимает места для целей макета.
Виктор
6

Отличный ответ от Самира и Абеля Терефе. Однако, по моему мнению, когда вы удаляете представление, вы хотите удалить представление с определенным идентификатором. Вот как это сделать.

1, присвойте представлению идентификатор при его создании:

_textView.setId(index);

2, удалите представление с идентификатором:

removeView(findViewById(index));
Кай Ван
источник
1

вы можете использовать addView или removeView

Ява:

// Root Layout
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setOrientation(LinearLayout.VERTICAL);

// TextView
TextView textView = new TextView(context);
textView.setText("Sample");

// Add TextView in LinearLayout
linearLayout.addView(textView);

// Remove TextView from LinearLayout
linearLayout.removeView(textView);

Котлин:

// Root Layout
val linearLayout = LinearLayout(context)
linearLayout.gravity = Gravity.CENTER
linearLayout.orientation = LinearLayout.VERTICAL

// TextView
val textView = TextView(context)
textView.text = "Sample"

// Add TextView in LinearLayout
linearLayout.addView(textView)

// Remove TextView from LinearLayout
linearLayout.removeView(textView)
Расул Мири
источник
0

привет, если вы новичок в Android, используйте этот способ. Примените свое представление, чтобы оно исчезло. GONE - это один способ, иначе получите родительский вид и удалите оттуда дочерний элемент ... иначе получите родительский макет и используйте его метод удалить все дочерние parentView.remove (child)

Я бы предложил использовать подход GONE ...

Зала Джанаксинх
источник
1
GONE эффективно скроет вид, но не удалит его из макета
Sababado
1
Просто используйте parentView.remove (removeViewName);
Zala Janaksinh
Вы правы насчет этого, но я пытался намекнуть, что вы не ответили на вопрос, предоставив решение "GONE".
Sababado
0

Я удаляю представление, используя метод start и count, я добавил 3 представления в линейном макете.

view.removeViews (0, 3);

Санджай Госвами
источник
0

Многоразовое расширение Kotlin

Упростите удаление

Добавьте это расширение:

myView.removeSelf()

fun View?.removeSelf() {
    this ?: return
    val parent = parent as? ViewGroup ?: return
    parent.removeView(this)
}

Упростите сложение

Вот несколько вариантов:

// Built-in
myViewGroup.addView(myView)

// Null-safe extension
fun ViewGroup?.addView(view: View?) {
    this ?: return
    view ?: return
    addView(view)
}

// Reverse addition
myView.addTo(myViewGroup)

fun View?.addTo(parent: ViewGroup?) {
    this ?: return
    parent ?: return
    parent.addView(this)
}
Гибольт
источник