2012-03-11 54 views
0

我想以編程方式添加到LinearLayout某些TextViews。我想用LayoutInflater。我在我的活動佈局的xml文件:添加TextView到LinearLayout時的ClassCastException

<LinearLayout 
    android:id="@+id/linear_layout" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    /> 

我已經寫在這樣下面的活動代碼。

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout); 
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
TextView textView = (TextView) inflater.inflate(R.layout.scale, linearLayout, true); 
textView.setText("Some text"); 
linearLayout.addView(textView); 

scale.xml文件看起來像:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:layout_marginLeft="50dp" 
    android:layout_marginRight="50dp" 
    android:drawableTop="@drawable/unit" 
    /> 

在生產線TextView textView = (TextView) inflater.inflate(R.layout.scale, linearLayout, true);我有致命的異常這樣的下面。

java.lang.RuntimeException: Unable to start activity ComponentInfo{my.package/my.package.MyActivity}: 
java.lang.ClassCastException: android.widget.LinearLayout 
Caused by: java.lang.ClassCastException: android.widget.LinearLayout 

當我有問題的行linearLayout與空代替我沒有任何異常,但是從我的scale.xmlandroid:layout_marginLeftandroid:layout_marginRight被忽略,我看不到任何利潤增加周圍TextView的。

我發現問題Android: ClassCastException when adding a header view to ExpandableListView但在我的情況下,我在使用充氣器的第一行中有例外。

回答

2

當您在調用inflater.inflate()時指定根視圖(linearLayout)時,充氣視圖會自動添加到視圖層次結構中。因此,您無需致電addView。另外,正如您注意到的那樣,返回的視圖是層次結構的根視圖(一個LinearLayout)。要到TextView本身的引用,然後你可以檢索:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout); 
LayoutInflater inflater = (LayoutInflater) getApplicationContext(). 
    getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
inflater.inflate(R.layout.scale, linearLayout, true); 
TextView textView = (TextView) linearLayout.getChildAt(
    linearLayout.getChildCount()-1); 
textView.setText("Some text"); 

如果你給視圖中scale.xml的android:id屬性,你可以用

TextView textView = (TextView) linearLayout.findViewById(R.id.text_id); 
+0

謝謝檢索你,但我不明白。我的'LinearLayout'在佈局文件中沒有任何子視圖。如何在這種情況下使用'getChildAt'方法?當我嘗試使用帶有LinearLayout的'inflater.inflate()'作爲我的'ViewGroup'時,我有個例外。當我使用'null'作爲'ViewGroup'時,我的應用程序可以工作,但在這種情況下,我再次無法使用'getChildAt'方法。 – woyaru 2012-03-11 21:26:22

+1

@woyaru - 在'inflater.inflate'返回之後,膨脹的'TextView'將被添加到'linearLayout'中。異常即將到來是因爲當它實際上返回'linearLayout'本身時,您試圖將返回值轉換爲'TextView'。 ('inflater.inflate'只有在根視圖爲'null'的情況下才返回虛擬視圖,如果不是'null',則返回根視圖,而不是虛擬視圖。) – 2012-03-11 21:31:11

+0

非常感謝! – woyaru 2012-03-11 21:34:02

相關問題