I got this error message state android.view.InflateException: Binary XML file line #9: Error inflating class fragment
. Is it because of i'm not extending it into fragment
in MessagesFragment
? By the way, my app using TabHost
.
FirstFragment.java
package com.xxxxx.yyyyy.match;
import com.xxxxx.yyyyy.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FirstFragment extends Fragment {
public FirstFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = LayoutInflater.from(getActivity()).inflate(R.layout.first_fragment,
null);
return v;
}
}
first_fragment.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/darker_gray"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".FirstFragment" >
<fragment
android:name="com.xxxxx.yyyyy.chat.MessagesFragment"
android:id="@+id/msg_list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</RelativeLayout>
MessagesFragment.java
package com.xxxxx.yyyyy.chat;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.xxxxx.yyyyy.R;
import com.xxxxx.yyyyy.library.chat.DataProvider;
import android.app.Activity;
import android.app.ListFragment;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
public class MessagesFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final DateFormat[] df = new DateFormat[] {
DateFormat.getDateInstance(), DateFormat.getTimeInstance()};
private OnFragmentInteractionListener mListener;
private SimpleCursorAdapter adapter;
private Date now;
@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 onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
now = new Date();
adapter = new SimpleCursorAdapter(getActivity(),
R.layout.chat_list_item,
null,
new String[]{DataProvider.COL_MSG, DataProvider.COL_AT},
new int[]{R.id.text1, R.id.text2},
0);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
switch(view.getId()) {
case R.id.text1:
LinearLayout root = (LinearLayout) view.getParent().getParent();
if (cursor.getString(cursor.getColumnIndex(DataProvider.COL_FROM)) == null) {
root.setGravity(Gravity.RIGHT);
root.setPadding(50, 10, 10, 10);
} else {
root.setGravity(Gravity.LEFT);
root.setPadding(10, 10, 50, 10);
}
break;
case R.id.text2:
TextView tv = (TextView) view;
tv.setText(getDisplayTime(cursor.getString(columnIndex)));
return true;
}
return false;
}
});
setListAdapter(adapter);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getListView().setDivider(null);
Bundle args = new Bundle();
args.putString(DataProvider.COL_EMAIL, mListener.getProfileEmail());
getLoaderManager().initLoader(0, args, this);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
public String getProfileEmail();
}
private String getDisplayTime(String datetime) {
try {
Date dt = sdf.parse(datetime);
if (now.getYear()==dt.getYear() && now.getMonth()==dt.getMonth() && now.getDate()==dt.getDate()) {
return df[1].format(dt);
}
return df[0].format(dt);
} catch (ParseException e) {
return datetime;
}
}
//----------------------------------------------------------------------------
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String profileEmail = args.getString(DataProvider.COL_EMAIL);
CursorLoader loader = new CursorLoader(getActivity(),
DataProvider.CONTENT_URI_MESSAGES,
null,
DataProvider.COL_FROM + " = ? or " + DataProvider.COL_TO + " = ?",
new String[]{profileEmail, profileEmail},
DataProvider.COL_AT + " DESC");
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
Output from logcat
03-06 16:52:05.729: E/AndroidRuntime(5419): FATAL EXCEPTION: main
03-06 16:52:05.729: E/AndroidRuntime(5419): android.view.InflateException: Binary XML file line #9: Error inflating class fragment
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
03-06 16:52:05.729: E/AndroidRuntime(5419): at com.xxxxx.yyyyy.FirstFragment.onCreateView(FirstFragment.java:38)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.os.Handler.handleCallback(Handler.java:730)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.os.Handler.dispatchMessage(Handler.java:92)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.os.Looper.loop(Looper.java:137)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.app.ActivityThread.main(ActivityThread.java:5136)
03-06 16:52:05.729: E/AndroidRuntime(5419): at java.lang.reflect.Method.invokeNative(Native Method)
03-06 16:52:05.729: E/AndroidRuntime(5419): at java.lang.reflect.Method.invoke(Method.java:525)
03-06 16:52:05.729: E/AndroidRuntime(5419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-06 16:52:05.729: E/AndroidRuntime(5419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-06 16:52:05.729: E/AndroidRuntime(5419): at dalvik.system.NativeStart.main(Native Method)
03-06 16:52:05.729: E/AndroidRuntime(5419): Caused by: java.lang.ClassCastException: com.xxxxx.yyyyy.HomeActivity@419d4fa8 must implement OnFragmentInteractionListener
03-06 16:52:05.729: E/AndroidRuntime(5419): at com.xxxxx.yyyyy.chat.MessagesFragment.onAttach(MessagesFragment.java:49)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:848)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1039)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1141)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.app.Activity.onCreateView(Activity.java:4746)
03-06 16:52:05.729: E/AndroidRuntime(5419): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
03-06 16:52:05.729: E/AndroidRuntime(5419): ... 20 more
I see this lines in your layout code :
android:layout_height="0dip"
android:layout_weight="1"
RelativeLayout
does not support weight
attribute. Your MessageFragment
's height will always be 0. So you should set layout_height
to match_parent
.
Also if possible, post stack trace of your error.
Also you have used Fragment from support library in FirstFragment but not in MessageFragment. It must be a typo which need to be fixed or it will give you an error on devices with API less than 11.
Edit : It seems your HomeActivity
is not implementing OnFragmentInteractionListener
, which is throwing ClassCastException
in onAttach callback.
call your setListAdapter(adapter);
in onActivityCreated()
check the lifecycle methodes
http://developer.android.com/guide/components/fragments.html
onCreate() calls before initializing the fragment;
also chenge this
View v = LayoutInflater.from(getActivity()).inflate(R.layout.first_fragment,
false);
In your MessagesFragment
's onAttach
, your com.xxxxx.yyyyy.HomeActivity
is passed in as activity.
Then, in the following code, you expect HomeActivity
is also OnFragmentInteractionListener
mListener = (OnFragmentInteractionListener) activity;
To solve this, you need to make your HomeActivity
public class HomeActivity extends Activity implements OnFragmentInteractionListener
Not sure if this will fix the problem, but I had one similar to it and I couldn't believe how easy it was to miss it / fix.
If you check your xml file, you will see your fragment labeled as:
<fragment
android:name="com.xxxxx.yyyyy.chat.MessagesFragment"
android:id="@+id/msg_list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
Try simply capitalizing the 'f' in 'Fragment' so that the XML Auto complete will recognize that you likely mean a (android.support.v4.app.Fragment)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.