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

时间:2014-03-25 13:56:04

标签: java android layout view add

我知道这个话题并不是什么新鲜事,但我真的很难接受这个并尝试了很多答案,但我仍然不能说清楚我应该写什么,在哪里写和使用。

我有这个布局文件 settings.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    ...

    <TextView
        android:id="@+id/pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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_width="wrap_content"
        android:layout_height="wrap_content"
        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内容?如何指出所需的布局?

2 个答案:

答案 0 :(得分:2)

为什么需要删除/添加此View?如果我正确理解了这个组件的目标,最好的方法就是隐藏/显示它:

 passdel.setVisibility(View.GONE);
 passdel.setVisibility(View.VISIBLE);

当然,在您从passdel移除ViewGroup后,它已经没有父母了,所以在尝试拨打{{1}时您将获得NPEonPasSet()

之后

答案 1 :(得分:0)

正如您所建议的,getParent()无法正常运行in TextView未实例化。 你应该以不同的方式获得布局。 您可以findViewById(R.id.layout.id)完成此操作。

实施例: 在XML中:

<LinearLayout
...
android:id="@+id/my_layout">
...

活动:

LinearLayout ll = (LinearLayout) findViewById(R.id.my_layout);
ll.addView(myView);