2014-03-25 73 views
1

我知道這個話題不算什麼新東西,但我真的被這個問題困住了,並且嘗試了很多答案,但我仍然無法說清楚我應該寫什麼和在哪裏寫和使用。如何以編程方式正確添加視圖?

我有這個佈局文件的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的東西?如何指出所需的佈局?

+1

你會如何期待'((LinearLayout)passdel.getParent()).addView(passdel);'工作嗎?如果你在某處添加'passdel',可能是因爲它沒有父節點,所以'getParent'不能返回任何東西,只能爲空。你應該直接引用佈局,給它一個id。 – njzk2

回答

2

爲什麼你需要刪除/添加此View?如果我理解正確此組件的目標,最好的辦法將只是隱藏/顯示它:

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

當然,您解除ViewGrouppassdel之後,它有沒有父母了,所以你」 (0128),然後嘗試撥打onPasSet()後得到NPEonPasDel()

+0

我決定不使用setVisibility,因爲它只是讓我的視圖不可見,而且這些視圖的空白空間保持空白。我還沒有找到一種方法來刪除這個空白區域,因此動態刪除和添加視圖對我來說似乎是最好的方法。 P.S我是一個新手 – anindis

+1

@anindis不,從'View.GONE'的文檔描述:這個視圖是不可見的,**它不佔用任何空間用於佈局目的。** – nikis

+0

哦。謝謝。不知何故,我沒有碰到GONE。以爲只有可見和不可見。我沒有注意到你寫了GONE。抱歉。對我感到羞恥 – anindis

0

正如你所建議的,getParent()將無法​​工作intil TextView沒有實例化。 你應該以不同的方式獲得佈局。 您可以通過findViewById(R.id.layout.id)來完成。

例: 在XML:

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

在活動時間:

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

是的,它的工作原理。謝謝。現在對我來說很清楚 – anindis

相關問題