从布局添加和删除视图


Answers:


219

我这样做是这样的:

((ViewManager)entry.getParent()).removeView(entry);

45
在更新的SDK中(ViewGroup):)
Ron

@schwiz在这种情况下,我们该如何重置视图ID。我的问题是即使我的活动完成后,每当添加下一个视图时,视图ID就会增加。当我再次回到此活动时,我希望视图ID默认为1 。
AndroidNewBee

非常感谢您提供这个答案
hem 2016年

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

假设我有一个附有onClickListener的textView。如果我将其消失然后点击,事件是否还会触发?
ahitt6345 '16

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()是我一直在寻找的东西!
艾伦(Alan)

6

要更改可见性:

predictbtn.setVisibility(View.INVISIBLE);

删除:

predictbtn.setVisibility(View.GONE);

它解决了我的问题,而不是其他所有答案。如果像我一样有用,您的背景或某些参数会阻止视图完全消失。
Virthuss 2015年

1
这是因为View.GONE不会删除布局的视图,只会使其不可见,并且不会为布局目的占用任何空间。
维克多

6

来自Sameer和Abel Terefe的伟大答案。但是,当您删除视图时,可以选择删除具有特定ID的视图。这是你怎么做的。

1,在创建视图时为其指定一个ID:

_textView.setId(index);

2,删除带有id的视图:

removeView(findViewById(index));

1

您可以使用addView或removeView

Java的

// 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 2012年

1
简单使用parentView.remove(removeViewName);
Zala Janaksinh

您对此表示正确,但我试图暗示您没有通过提供“ GONE”解决方案来回答问题。
Sababado 2012年


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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.