如何以编程方式正确添加视图?
Posted
技术标签:
【中文标题】如何以编程方式正确添加视图?【英文标题】:How to properly add view programatically? 【发布时间】:2014-03-25 13:56:03 【问题描述】:我知道这个话题并不新鲜,但我真的被这个话题困住了,尝试了很多答案,但我仍然无法弄清楚我应该在哪里写和使用什么。
我有这个布局文件settings.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
...
<TextView
android:id="@+id/pass"
android:layout_
android:layout_
android:layout_marginLeft="7dp"
android:layout_marginTop="10dp"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/pass_del"
android:layout_
android:layout_
android:layout_marginBottom="10dp"
android:layout_marginLeft="7dp"
android:layout_marginTop="7dp"
android:text="Удалить пароль"
android:textAppearance="?android:attr/textAppearanceMedium" />
...
</LinearLayout>
我有TextView passdel
,我想以编程方式添加。它的onCreate
描述是passdel=(TextView) findViewById(R.id.pass_del);
我有这些方法
public void onPasSet()
pass.setText("Сменить пароль");
((LinearLayout)passdel.getParent()).addView(passdel);
public void onPasDel()
pass.setText("Установить пароль");
((LinearLayout)passdel.getParent()).removeView(passdel);
onPasDel
运行良好。
我猜Java采用当前布局。所以当我删除View
时,它就在这个布局上。当我尝试添加这个View
时,Java 尝试在当前布局上找到这个视图,但它被删除了,所以..nullpointerexception。我应该如何正确地写所有addView
的东西?如何指向所需的布局?
【问题讨论】:
您希望((LinearLayout)passdel.getParent()).addView(passdel);
如何工作?如果您在某处添加passdel
,可能是因为它没有父级,因此getParent
只能返回null。你应该直接引用布局,给它一个 id。
【参考方案1】:
为什么需要删除/添加这个View
?如果我正确理解了这个组件的目标,最好的方法就是隐藏/显示它:
passdel.setVisibility(View.GONE);
passdel.setVisibility(View.VISIBLE);
当然,在你从ViewGroup
中删除passdel
之后,它就没有父母了,所以你会在尝试在onPasDel()
之后调用onPasSet()
时得到NPE
【讨论】:
我决定不使用 setVisibility,因为它只会让我的视图不可见,并且这些视图的空白区域只是保持空白。我还没有找到删除此空白空间的方法,因此动态删除和添加视图对我来说似乎是最好的方法。 P.S 我是新手 @anindis 不,来自View.GONE
的文档描述:此视图是不可见的,它不占用任何空间用于布局。
哦。谢谢你。不知何故,我没有遇到 GONE。以为只有可见和不可见。我没有注意到你写了 GONE。对不起。真丢脸【参考方案2】:
正如您所建议的,getParent()
将无法工作,直到 TextView
未被实例化。
您应该以不同的方式获得布局。
您可以通过findViewById(R.id.layout.id)
来完成。
示例: 在 XML 中:
<LinearLayout
...
android:id="@+id/my_layout">
...
活动中:
LinearLayout ll = (LinearLayout) findViewById(R.id.my_layout);
ll.addView(myView);
【讨论】:
以上是关于如何以编程方式正确添加视图?的主要内容,如果未能解决你的问题,请参考以下文章