如何以编程方式正确添加视图?

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);

【讨论】:

以上是关于如何以编程方式正确添加视图?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加的子视图框架不会显示在滚动视图中

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

如何以编程方式为其父视图添加视图大小?

如何以编程方式添加和保留文本视图?

如何以编程方式使用自动布局添加自定义视图

如何以编程方式将视图添加到 NSWindow(或 NSView)?