0

ユーザーから説明を取得するためのポップアップ画面を表示します。EditText を除いて、ほとんどすべてのコントロール (テキストビュー、ボタン、チェックボックスなど) を問題なく追加できます。以下のようなエラーが表示されます。

Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class <unknown> 

コード側

    public RouteAdapter(Activity a, RouteResultDto list, boolean editMode, BaseFollower userInfo, boolean isFavoriteStatus) {
    this.activity = a;
    this.routeList=list;
    this.editMode = editMode;
    this.userInfo = userInfo;
    this.isFavorite = isFavoriteStatus;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());

//throws the exception at line below
    lnPopupMain = (LinearLayout) LayoutInflater.from(activity).inflate(R.layout.popup_route_edit, null);

    float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, activity.getResources().getDisplayMetrics());
    float height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, activity.getResources().getDisplayMetrics());
    popupEditRoute = new PopupWindow(lnPopupMain, (int)width, (int)height, true);

    popupEditRoute.setBackgroundDrawable(new BitmapDrawable());
    popupEditRoute.setOutsideTouchable(true);
}

レイアウト面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:padding="10dip"
              android:layout_width="200dip"
              android:layout_height="160dip"
              android:background="@color/black"
              android:id="@+id/lnPopupMain"
              android:focusable="true"
        >

    <EditText android:layout_width="match_parent"
              android:layout_height="80dip"
              android:id="@+id/txtRouteEdit"
            android:background="@color/white">
    </EditText>
</LinearLayout>

(EditText の代わりに TextView や Button を使用しても例外はありません。EditText の問題は何ですか?)

4

2 に答える 2

0

LayoutInflater は、それが実行されるスレッドについて何の仮定も行いません。そして、そのドキュメントにはこれについて何も言及されていません。また、そのコードの継ぎ目はスレッドに依存しないようになっています。

一方、LayoutInflater によって作成されたビューは、コンストラクターでハンドラーをインスタンス化する場合があります。おそらくそうすべきではありませんが、コンストラクターでハンドラーを作成/使用しないという要件はありません。

全体として、ビューがコンストラクターでハンドラーとルーパーを使用しないという明示的な要件がないため、非 UI スレッドからのビューの膨張が安全であると想定することはできません。

実際にHandlerThreadを作成し、その中でビューを膨らませてみることができます。しかし、Samsung Galaxy S の例では、ビューはこのスレッドがビューの存続期間中に生きていると想定し、ルーパーを使用してすべてのメッセージを処理するため、これは非常に危険です。後でクラッシュする可能性があります。

于 2012-12-06T13:14:36.797 に答える
0

解決しました。理由はわかりませんが、リスナーにポップアップ ウィンドウを作成する必要があります。

        imgEditOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lnPopupMain = (LinearLayout)inflater.inflate(R.layout.popup_route_edit, null);
                float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, activity.getResources().getDisplayMetrics());
                float height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, activity.getResources().getDisplayMetrics());
                popupEditRoute = new PopupWindow(lnPopupMain, (int)width, (int)height, true);
                popupEditRoute.setBackgroundDrawable(new BitmapDrawable());
                popupEditRoute.setOutsideTouchable(true);
                popupEditRoute.showAtLocation(lnPopupMain, Gravity.CENTER, 10, 10);
            }
        });
于 2012-12-06T13:17:13.947 に答える