Android: InflateException для составного компонента - PullRequest
0 голосов
/ 21 июля 2011

Я создаю довольно сложный составной компонент, который вызывает исключение InflateException с неизвестной причиной.Мне удалось воспроизвести ошибку в упрощенной версии ниже, которая является просто компонентом с двумя текстовыми представлениями.Буду признателен за любую помощь в выявлении ошибки или ее отслеживании.

композит_компонент.xml

<?xml version="1.0" encoding="utf-8"?>
<com.cc.CompositeComponent 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:text="One"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="Two"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</com.cc.CompositeComponent>

CompositeComponent.java

package com.cc;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class CompositeComponent extends LinearLayout {

    public CompositeComponent(Context context) {
    super(context);
    }

    public CompositeComponent(Context context, AttributeSet attributes){
        super(context, attributes);
    }

    protected void onFinishInflate() {
        super.onFinishInflate();
        ((Activity)getContext()).getLayoutInflater().inflate(R.layout.composite_component, this);
    }
}

CompositeActivity.java

package com.cc;

import android.app.Activity;
import android.os.Bundle;

public class CompositeActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.composite_component);
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cc"
    android:versionCode="1"
    android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="CompositeComponent">
    <activity android:name="CompositeActivity"
              android:label="CompositeComponent">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

1 Ответ

0 голосов
/ 21 июля 2011

В своем файле composite_component.xml попробуйте изменить эту строку:

<com.cc.CompositeComponent

на следующее:

<LinearLayout

А затем создайте второй макет, который будет использоваться в вашей деятельностипередает в setContentView():

Файл: composite_activity_layout.xml

<com.cc.CompositeComponent
    android:id="@+id/my_composite"
    <!-- other stuff ->>

Файл: CompositeActivity.java

protected void onCreate( Bundle state ) {
    super.onCreate( state );

    setContentView(R.layout.composite_activity_layout);
    // ...
}

Похоже, что вы делаете, вызывая рекурсивную инфляцию макета.Вы надуваете CompositeComponent, а затем в методе onFinishInflate(), CompositeComponent раздувает другую копию самого себя.

Также вы можете захотеть изучить использование тега слияния Android избегайте того, чтобы этот дополнительный LinearLayout слонялся вокруг.

...