【问题标题】:android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> in ListFragment with sliding tabsandroid.view.InflateException: Binary XML file line #2: Error inflating class <unknown> in ListFragment with slip tabs
【发布时间】:2015-09-30 10:15:58
【问题描述】:

我的Logcat如下:

09-30 01:02:26.708    2545-2545/? D/AndroidRuntime﹕ Shutting down VM
09-30 01:02:26.709    2545-2545/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.swati.newsaggregator, PID: 2545
android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
        at android.view.LayoutInflater.createView(LayoutInflater.java:633)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
        at com.example.swati.newsaggregator.FeedListAdapter.getView(FeedListAdapter.java:65)
        at android.widget.AbsListView.obtainView(AbsListView.java:2347)
        at android.widget.ListView.measureHeightOfChildren(ListView.java:1270)
        at android.widget.ListView.onMeasure(ListView.java:1182)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17547)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1489)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17547)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:940)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
        at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:393)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
        at android.view.View.measure(View.java:17547)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:
09-30 01:02:26.710    1233-1247/? W/ActivityManager﹕ Force finishing activity 1 com.example.swati.newsaggregator/.MainActivity

这是不能膨胀的xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/feed_bg"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    android:layout_marginLeft="@dimen/feed_item_margin"
    android:layout_marginRight="@dimen/feed_item_margin"
    android:layout_marginTop="@dimen/feed_item_margin"
    android:background="@drawable/bg_parent_rounded_corner"
    android:orientation="vertical"
    android:paddingBottom="@dimen/feed_item_padding_top_bottom"
    android:paddingTop="@dimen/feed_item_padding_top_bottom" >
    <TextView
        android:id="@+id/txtStatusMsg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="5dp"
        android:paddingLeft="@dimen/feed_item_status_pad_left_right"
        android:paddingRight="@dimen/feed_item_status_pad_left_right"
        android:paddingTop="@dimen/feed_item_status_pad_top" />

    <TextView
        android:id="@+id/txtUrl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:linksClickable="true"
        android:paddingBottom="10dp"
        android:paddingLeft="@dimen/feed_item_status_pad_left_right"
        android:paddingRight="@dimen/feed_item_status_pad_left_right"
        android:textColorLink="@color/link" />

    <com.example.swati.newsaggregator.FeedImageView
        android:id="@+id/feedImage1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:scaleType="fitXY"
        android:visibility="visible" />
</LinearLayout>

ListFragment 的代码

    public class BnewsFragment extends ListFragment {


private static final String ARG_CATEGORY = "category";
private String mcategory;
private final String TAG = "LIST_FRAG";
private OnFragmentInteractionListener mListener;
private FeedListAdapter listAdapter;
private View mView;
private List<FeedItem> feedItems;
private String URL_FEED = "some URL";

public static BnewsFragment newInstance(String category) {
    BnewsFragment fragment = new BnewsFragment();
    Bundle args = new Bundle();
    args.putString(ARG_CATEGORY, category);
    fragment.setArguments(args);
    return fragment;
}

public BnewsFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mcategory = getArguments().getString(ARG_CATEGORY);
    }

    feedItems = new ArrayList<FeedItem>();
    listAdapter = new FeedListAdapter(getContext(), feedItems);
    setListAdapter(listAdapter);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d(TAG,"onCreateView inflated!");
    mView= inflater.inflate(R.layout.list_fragment, container, true);
    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Cache.Entry entry = cache.get(URL_FEED);
    if (entry != null) {
        // fetch the data from cache
        Log.d(TAG,"Cache not empty!");
        try {
            String data = new String(entry.data, "UTF-8");
            try {
                parseJsonFeed(new JSONObject(data));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    else {
        // making fresh volley request and getting json
        Log.d(TAG, "making fresh volley request cache empty");
        JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET,
                URL_FEED, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                VolleyLog.d(TAG, "InitialResponse: " + response.toString());
                if (response != null) {
                    Log.d(TAG,"Successful non-null response!");
                    parseJsonFeed(response);
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                Log.d(TAG,"request error!" + error.getMessage());
            }
        });
        // Adding request to volley request queue
        AppController.getInstance().addToRequestQueue(jsonReq);
    }
    return mView;
}

       /* @Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentInteractionListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
}*/

/*@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}*/

/*@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    if (null != mListener) {
        // Notify the active callbacks interface (the activity, if the
        // fragment is attached to one) that an item has been selected.
        mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
    }
}*/

private void parseJsonFeed(JSONObject response) {
    try {
        JSONArray feedArray = response.getJSONArray("articles");
        Log.d(TAG,"inside parseJsonfeed");
        for (int i = 0; i < feedArray.length(); i++) {
            JSONObject feedObj = (JSONObject) feedArray.get(i);
            FeedItem item = new FeedItem();
            Log.d(TAG, feedObj.getString("title"));
            //item.setId(feedObj.getInt("id"));
            //item.setName(feedObj.getString("name"));

            // Image might be null sometimes
            //String image = feedObj.isNull("image") ? null : feedObj
            //        .getString("image");
            //item.setImge(image);
            item.setImge(null);
            item.setStatus(feedObj.getString("title"));
            //item.setProfilePic(feedObj.getString("profilePic"));
            //item.setTimeStamp(feedObj.getString("timeStamp"));

            // url might be null sometimes
            //String feedUrl = feedObj.isNull("url") ? null : feedObj
            //        .getString("url");
            item.setUrl(null);
            feedItems.add(item);
        }
        // notify data changes to list adapater
        listAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

在一个简单的 listView 中,这个文件被成功地膨胀了。但是,一旦我将它添加到自定义 ListFragment 中,就会弹出此错误。目前,我还没有解析任何图像。

【问题讨论】:

  • 发布您的 ListFragment 代码。
  • 你好,我也添加了 ListFragment 代码。
  • 尝试在 onCreateView() 中调用 setListAdapter(listAdapter); 而不是 onCreate()。
  • 我也试过了。或者,当我尝试在片段而不是 ListFragment 中添加自定义 listView 并将其适配器设置在 onCreateView() 中时,它仍然给我完全相同的错误!
  • xmlns:android="http://schemas.android.com/apk/res/android" 添加到您的主要LinearLayout

标签: android xml android-layout android-listfragment layout-inflater


【解决方案1】:

由于您已经覆盖了 ListFragment 中的 onCreateView,因此您的布局文件 (list_fragment.xml) 应该包含一个 listView。

请参阅此处的文档:http://developer.android.com/reference/android/app/ListFragment.html

抱歉,将其发布为答案,因为我没有 50 个代表点来发表评论。

【讨论】:

  • 它确实包含一个 listView 和一个用于空列表的替代 textView。问题出在 feed_item.xml 中,它定义了列表每一行的布局。
  • 您在 xml 布局的末尾缺少 。但这应该是一个编译错误。另外,我认为您应该尝试删除所有布局,并在布局中只保留一个 TextView,然后测试它是否有效。发布适配器的代码可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多