ClassCastException при добавлении TextView в LinearLayout - PullRequest
1 голос
/ 12 марта 2012

Я хотел бы программно добавить LinearLayout некоторые TextViews. И я хочу использовать LayoutInflater. У меня есть в XML-файле макета активности:

<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 на ноль, у меня нет никаких исключений, но android:layout_marginLeft и android:layout_marginRight из моего scale.xml игнорируются, и я не вижу полей вокруг добавленного TextView.

Я нашел вопрос Android: ClassCastException при добавлении представления заголовка в ExpandableListView , но в моем случае у меня есть исключение в первой строке, в которой я использую инфлятор.

1 Ответ

3 голосов
/ 12 марта 2012

Когда вы указываете корневой вид (linearLayout) в вызове inflater.inflate(), раздутый вид автоматически добавляется в иерархию видов.Следовательно, вам не нужно звонить addView.Также, как вы заметили, возвращаемое представление является корневым представлением иерархии (a 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");

Если бы вы дали представлению атрибут android:id в scale.xml, вы могли бы получить его с помощью

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