3

Android マーケットのアプリケーションから奇妙なスタック トレースが発生しています。2 つのビューを含むビュー スイッチャーがあり、そのうちの 1 つにはチェックボックスが含まれています。

カスタム ビューであるこのスタック トレース AdDetailView を取得しています。

  android.view.InflateException: Binary XML file line #29: Error inflating class android.widget.CheckBox
  at android.view.LayoutInflater.createView(LayoutInflater.java:513)
  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:382)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
  at com.yakaz.view.AdDetailView.init(AdDetailView.java:67)
  at com.yakaz.view.AdDetailView.<init>(AdDetailView.java:78)

これは、次のビュー コンストラクターで発生します。

private void init(Context context) {
    LayoutInflater li = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    li.inflate(R.layout.ad_detail_view, this);
    setOrientation(LinearLayout.VERTICAL);
}

public AdDetailView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

行 67 は膨張行です。

問題は、エミュレータまたはデバイスで問題を再現できないことです。ポインタはありますか?

ここに ad_detail_view.xml があります

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:id="@+id/preview_warning"
    style="@style/Notification" android:text="@string/this_is_only_a_preview"
    android:visibility="gone" />

<ScrollView android:layout_width="fill_parent"
    android:fadingEdge="none" android:layout_height="fill_parent"
    android:layout_weight="1" android:fillViewport="true" android:id="@+id/scrolls">
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:orientation="vertical">

        <include layout="@layout/action_bar" />

        <LinearLayout android:orientation="horizontal"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:paddingTop="10dp" android:paddingLeft="10dp"
            android:paddingRight="10dp">
            <!--  tags -->
            <LinearLayout android:id="@+id/tagsLayout"
                android:orientation="horizontal" android:layout_width="fill_parent"
                android:layout_weight="1" android:layout_height="wrap_content" />
            <CheckBox android:id="@+id/save_button" style="@style/StarButton"
                android:layout_marginRight="10sp" />
        </LinearLayout>


        <!--  meta -->
        <Button android:id="@+id/meta" style="@style/Meta"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"/>


        <!-- pictures -->
        <LinearLayout android:orientation="horizontal"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:gravity="center" android:id="@+id/gallery_container">
            <Gallery android:id="@+id/gallery" android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>


        <!--  padded layout -->
        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:orientation="vertical"
            android:padding="5dp">

            <!-- summary -->
            <TextView android:id="@+id/summary" style="@style/AdDetailSummary"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:paddingBottom="10dp" />


        </LinearLayout>


        <!--  tab -->
        <LinearLayout android:layout_width="fill_parent"
            android:orientation="vertical" android:layout_height="wrap_content"
            android:background="@drawable/bottom_green_bar" android:paddingLeft="10dp">
            <TextView android:layout_width="wrap_content" android:id="@+id/tab_title"
                android:gravity="center" android:layout_height="wrap_content"
                android:text="@string/member_profile" style="@style/TabLabel" />
        </LinearLayout>

        <!-- user detail -->
        <LinearLayout android:layout_width="fill_parent"
            android:orientation="vertical" android:layout_height="wrap_content"
            android:background="@color/very_light_gray" android:paddingBottom="10dp">
            <!--  user item -->

            <include layout="@layout/user_item" />
            <include layout="@layout/website_item" />

        </LinearLayout>
    </LinearLayout>
</ScrollView>
</merge>

style.xml :

<style name="StarButton">
    <item name="android:background">@drawable/bk_star_button</item>
    <item name="android:layout_width">30dp</item>
    <item name="android:layout_height">30dp</item>
    <item name="android:button">@android:id/empty</item>
</style>

bk_star_button.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_star_big_off"
      android:state_checked="false"/>
    <item android:drawable="@drawable/btn_star_big_on"
      android:state_checked="true"/>          
</selector>

一部のデバイスでまったく同じ例外が発生した別のレイアウトを次に示します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:background="@drawable/bk_gradient">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:gravity="left|center_vertical" style="@style/TopBar"
        android:id="@+id/titlebar">
        <ImageView android:src="@drawable/logo" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:background="@null"
        android:layout_alignParentLeft="true" />

        <FrameLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_centerVertical="true"
        android:paddingLeft="8dp" android:id="@+id/search_progressbar"
        android:visibility="gone">
            <ProgressBar android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            style="@style/ProgressBarMedium" />
        </FrameLayout>

    <LinearLayout android:id="@+id/buttons_container"
    android:gravity="right|center_vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</LinearLayout>
    ....
</LinearLayout>
</LinearLayout>

例外を発生させるコード:

public static CompoundButton addTitleBarCompoundButton(Context context,
        View titleBar, CharSequence label, boolean isChecked) {
    if (!(titleBar instanceof ViewGroup))
        return null;

    ViewGroup group = (ViewGroup) titleBar
            .findViewById(R.id.buttons_container);

    // We attach to root during the inflating process othersize layout_
    // parameters in the style are ignored
    LayoutInflater.from(context).inflate(R.layout.topbar_toggle_button,
            group, true);

    // Get the result, which is the last child of the group
    CompoundButton result = (CompoundButton) group.getChildAt(group
            .getChildCount() - 1);
    result.setChecked(isChecked);

    // Set the text
    result.setText(label);
    return result;
}

topbar_toggle_button.xml :

<?xml version="1.0" encoding="utf-8"?>
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" style="@style/BarButton.Toggle"/>
4

4 に答える 4

2

同じ問題が発生した場合は、android.support.v7.widget.AppCompatCheckBox を使用してみてください

<android.support.v7.widget.AppCompatCheckBox
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/crime_solved"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:text="@string/crime_solved_label"/>
于 2016-05-07T16:01:06.867 に答える
1

のコンストラクターから inflate を呼び出す場合は、パラメーターを指定viewrootして呼び出す必要があります。attachToRootfalse

li.inflate(R.layout.ad_detail_view, this);

まだインスタンス化されていないためです(現在、コンストラクターにいます)。

ただし、表示されるエラーに基づいて、これが唯一の問題ではない可能性があるため、xml レイアウトを共有するとad_detail_view役立つ場合があります (エラーは、問題が xml ファイルの 29 行目にあることを示しています)。

于 2011-05-20T09:18:56.537 に答える
1

スタイルを定義しているときに、親のデフォルトの CheckBox スタイルとして指定していない可能性があります (私の提案)。したがって、一部の Android/Device では、その親で定義されたプロパティがありません。

または (この例外は CheckBox 自体に問題を引き起こすため)、apk (widget.CheckBox.java) に移動してみてください。

Android マーケットでは、クラッシュの原因となる Android のバージョンを確認できないのが残念です。これを確認するために Android 1.5 でエミュレータを実行しようとしましたか?

于 2011-05-26T15:28:27.600 に答える