AsyncTask LayoutInflater InflateException on EditText



我基本上有代码

new AsyncTask<Integer, Void, View>() {
@Override
protected View doInBackground(Integer... tabIds) {
    return mInflater.inflate(R.layout.layout_name, null);
}
@Override
protected void onPostExecute(View result) {
    super.onPostExecute(result);
            root_layout.addView(result);
}
}.execute(tabId);

layout_name.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white" >

<EditText
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text" />
<Button
    android:id="@+id/do_stuff"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

得到InflateException: Binary XML file line #x: Error inflating class <unknown>。如果我去除EditText,它的工作没有problems

我找不到它的原因(花了2小时)。

有人知道这是为什么吗?希望有一个解决方案

不要使用AsynTask,而是使用AsyncLayoutInflater,例如:

  MyClass extends Fragment implements  AsyncLayoutInflater.OnInflateFinishedListener {
        @Override
        public void onCreate(Bundle savedInstanceState) {
         new AsyncLayoutInflater(context).inflate(childViewId, parent, this);
         //show progress..
        }
        @Override
        public void onInflateFinished(View view, int resid, ViewGroup parent){
            if (view != null) {
             //You have inflated view to use in UI Thread.
            }
        }
    }

除此之外,它还有一些缺陷:AsyncLayoutInflater类也会处理视图不能异步膨胀的情况。这样的视图类没有处理程序实现,如果你试图在AsyncTask或Thread类中膨胀它们(就像你的情况一样),就会抛出异常。例如,EditText只能在UI线程中膨胀。将请求loop .loop();呼叫AsyncLayoutInflater将在UI线程中膨胀这样的视图,并异步休息。

最终你不能在单独的线程中膨胀EditText。这只是你想要达到的目标的一个变通办法。同样,您可以尝试HandlerThread,但不会有太大的好处。

change both

 android:layout_width="match_parent"

 android:layout_width="wrap_content"

它可能对你有帮助

相关内容

  • 没有找到相关文章

最新更新