我将显示一个弹出屏幕,用于从用户那里获取一些描述。我可以添加几乎所有控件(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有什么问题?)
答案 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);
}
});