基本片段上的android.view.InflateException

时间:2015-05-10 13:19:33

标签: java android android-layout android-fragments

我有一个非常基本的片段似乎导致我的问题,我无法弄清楚为什么。它在我的布局中膨胀片段时抛出InflateException。

HabitListActivity

package com.tertiushand.habitthat;

import android.graphics.Outline;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.widget.ImageButton;


public class HabitListActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_habit_list);

        //Create FAB button
        ImageButton fab = (ImageButton) findViewById(R.id.fab);
        ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                // Or read size directly from the view's width/height
                int size = getResources().getDimensionPixelSize(R.dimen.fab_size);
                outline.setOval(0, 0, size, size);
            }
        };
        fab.setOutlineProvider(viewOutlineProvider);
        //End FAB button
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_habit_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

activity_habit_list.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".HabitListActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <fragment
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="com.tertiushand.habitthat.TodoFragment"
            android:id="@+id/todofragment"
            tools:layout="@layout/fragment_todo_layout" />

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageButton
            android:id="@+id/fab"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true"
            android:layout_width="@dimen/fab_size"
            android:layout_height="@dimen/fab_size"
            android:layout_gravity="bottom|end"
            android:layout_marginEnd="15dp"
            android:layout_marginBottom="15dp"
            android:background="@drawable/ripple"
            android:stateListAnimator="@anim/anim"
            android:src="@drawable/ic_action_add"
            android:elevation="4dp"
            android:contentDescription="@string/habit_button_desc"
            android:baselineAlignBottom="false" />
    </RelativeLayout>



</FrameLayout>

ToDoFragment.java

package com.tertiushand.habitthat;

import android.app.Activity;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListAdapter;
import android.widget.TextView;


import com.tertiushand.habitthat.dummy.DummyContent;

/**
 * A fragment representing a list of Items.
 * <p/>
 * Large screen devices (such as tablets) are supported by replacing the ListView
 * with a GridView.
 * <p/>
 * Activities containing this fragment MUST implement the {@link OnFragmentInteractionListener}
 * interface.
 */
public class TodoFragment extends Fragment implements AbsListView.OnItemClickListener {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    /**
     * The fragment's ListView/GridView.
     */
    private AbsListView mListView;

    /**
     * The Adapter which will be used to populate the ListView/GridView with
     * Views.
     */
    private ListAdapter mAdapter;
    private CheckBox doneCheckBox;

    // TODO: Rename and change types of parameters
    public static TodoFragment newInstance(String param1, String param2) {
        TodoFragment fragment = new TodoFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public TodoFragment() {
    }

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

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        // TODO: Change Adapter to display your content
        //mAdapter = new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
        //        android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS);
        //doneCheckBox = new CheckBox(getActivity());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_todo_card, container, false);

        // Set the adapter
        mListView = (AbsListView) view.findViewById(android.R.id.list);
        ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);

        // Set OnItemClickListener so we can be notified on item clicks
        mListView.setOnItemClickListener(this);

        return view;
    }

    @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 onItemClick(AdapterView<?> parent, View view, int position, long 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);
        }
    }

    /**
     * The default content for this Fragment has a TextView that is shown when
     * the list is empty. If you would like to change the text, call this method
     * to supply the text it should use.
     */
    public void setEmptyText(CharSequence emptyText) {
        View emptyView = mListView.getEmptyView();

        if (emptyView instanceof TextView) {
            ((TextView) emptyView).setText(emptyText);
        }
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p/>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(String id);
    }

}

fragment_todo_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context="com.tertiushand.habitthat.TodoFragment">

    <ListView android:id="@android:id/list" android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView android:id="@android:id/empty" android:layout_width="match_parent"
        android:layout_height="match_parent" android:gravity="center" />

</FrameLayout>

这是异常堆栈:

05-10 06:59:34.876  20657-20657/? E/AndroidRuntime﹕ FATAL EXCEPTION: main    Process: com.tertiushand.habitthat, PID: 20657    java.lang.RuntimeException: Unable to start activity >ComponentInfo{com.tertiushand.habitthat/com.tertiushand.habitthat.HabitListActi>vity}: android.view.InflateException: Binary XML file line #16: Error inflating >class fragment
           at >android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
           at >android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
           at android.app.ActivityThread.access$800(ActivityThread.java:151)
           at >android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
           at android.os.Handler.dispatchMessage(Handler.java:102)
           at android.os.Looper.loop(Looper.java:135)
           at android.app.ActivityThread.main(ActivityThread.java:5254)
           at java.lang.reflect.Method.invoke(Native Method)
           at java.lang.reflect.Method.invoke(Method.java:372)
           at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    Caused by: android.view.InflateException: Binary XML file line #39: Error >inflating class fragment
           at >android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
           at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
           at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
           at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
           at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
           at >com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:37>8)
           at android.app.Activity.setContentView(Activity.java:2145)
           at >com.tertiushand.habitthat.HabitListActivity.onCreate(HabitListActivity.java:18)
           at android.app.Activity.performCreate(Activity.java:5990)
           at >android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
           at >android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at >android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at >android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    Caused by: java.lang.ClassCastException: >com.tertiushand.habitthat.HabitListActivity@5d5cc94 must implement >OnFragmentInteractionListener
           at >com.tertiushand.habitthat.TodoFragment.onAttach(TodoFragment.java:106)
           at >android.app.FragmentManagerImpl.moveToState(FragmentManager.java:853)
           at >android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1045)
           at >android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1147)
           at >android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2116)
           at android.app.Activity.onCreateView(Activity.java:5328)
           at >android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
            at >com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:37>8)
            at android.app.Activity.setContentView(Activity.java:2145)
            at >com.tertiushand.habitthat.HabitListActivity.onCreate(HabitListActivity.java:18)
            at android.app.Activity.performCreate(Activity.java:5990)
            at >android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at >android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at >android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at >android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)

2 个答案:

答案 0 :(得分:1)

<{1>}您将自己的活动TodoFragment投射到HabitListActivity,但OnFragmentInteractionListener未实施HabitListActivity,这导致了InflateException。变化

OnFragmentInteractionListener

public class HabitListActivity extends FragmentActivity {

实现public class HabitListActivity extends FragmentActivity implements OnFragmentInteractionListener { 接口的方法,然后再次运行

答案 1 :(得分:0)

试试这个......

删除以下部分代码..

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

    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }

    // TODO: Change Adapter to display your content
    //mAdapter = new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
    //        android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS);
    //doneCheckBox = new CheckBox(getActivity());
}

然后粘贴下面的代码  @覆盖     public View onCreateView(LayoutInflater inflater,ViewGroup容器,                              Bundle savedInstanceState){         查看view = inflater.inflate(R.layout.fragment_todo_card,container,false);

if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }