无法在Android中将EditText添加到Popup中

时间:2012-12-06 13:09:51

标签: android dialog popup android-edittext

我将显示一个弹出屏幕,用于从用户那里获取一些描述。我可以添加几乎所有控件(textview,按钮,复选框等),除了EditText之外没有任何问题。它给我一个错误如下。

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

CODE SIDE

    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>

(如果我使用TextView或Button而不是EditText,则没有任何异常.ReditText有什么问题?)

2 个答案:

答案 0 :(得分:0)

LayoutInflater不对它运行的线程做任何假设。在其文档中没有提到这一点。它的代码也与线程无关。

另一方面,LayoutInflater创建的视图可能会在其构造函数中实例化Handler。好吧,他们可能不应该这样做,但是没有要求他们不在他们的构造函数中创建/使用Handler。

总的来说,我会说,因为没有明确要求Views在其构造函数中不使用Handler和Loopers,所以你不能假设从非UI线程中膨胀视图是安全的。

您实际上可以创建HandlerThread并尝试在其中展开视图。但我认为这是非常危险的,因为在三星Galaxy S示例中,视图假定此线程在View生存期内将处于活动状态,并将使用其Looper处理所有消息。这可能会导致以后崩溃。

答案 1 :(得分: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);
            }
        });