简体   繁体   中英

Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #4: Error inflating class fragment

every thing work will but when i click on recycler view item and open details activity the app is crash

i know there are a ton of answers in this question and i tried them all but no one works for this problem also i got null pointer exception when i get arguments from fragment

my onclick interface that is in main fragment

public void onClick(long date) {
    Uri todayUri = WeatherContract.WeatherEntry.buildWeatherUriWithDate(date);
    DetailsFragment detailsFragment = (DetailsFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.details_fragment);
    if (todayUri != null) {
        String myUri = todayUri.toString();

        if (detailsFragment != null) {
            DetailsFragment detailsFragment1 = new DetailsFragment();
            Bundle bundle = new Bundle();
            bundle.putString(DetailsFragment.FRAGMENT_KEY, myUri);
            detailsFragment1.setArguments(bundle);
            detailsFragment = detailsFragment1;
            getActivity().getSupportFragmentManager().beginTransaction()
                    .replace(R.id.details_fragment, detailsFragment).commit();
        } else {
            Intent detailsActivity = new Intent();
            detailsActivity.setClass(getActivity(), DetailsActivity.class);
            detailsActivity.setData(todayUri);

            startActivity(detailsActivity);
        }
    }
}

my details activity

package com.example.freewaresys.sunshine;

import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class DetailsActivity extends FragmentActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
    Uri uri = getIntent().getData();
    String myUri = uri.toString();
    Bundle bundle = new Bundle();
    bundle.putString(DetailsFragment.FRAGMENT_KEY, myUri);
    DetailsFragment detailsFragment = new DetailsFragment();
    detailsFragment.setArguments(bundle);
    getSupportFragmentManager().beginTransaction()
            .add(R.id.activity_details_fragment, detailsFragment).commit();

}

}

my detail activity layout

<?xml version="1.0" encoding="utf-8"?>


<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.example.freewaresys.sunshine.DetailsFragment"
android:id="@+id/activity_details_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

my details fragment

package com.example.freewaresys.sunshine;

    import android.content.Context;
    import android.database.Cursor;
    import android.databinding.DataBindingUtil;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.LoaderManager;
    import android.support.v4.content.CursorLoader;
    import android.support.v4.content.Loader;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.support.v4.app.Fragment;
    import android.widget.ImageView;
    import android.widget.TextView;

    import com.example.freewaresys.sunshine.data.WeatherContract;
    import com.example.freewaresys.sunshine.databinding.FragmentDetailsBinding;
    import com.example.freewaresys.sunshine.sunshineUtils.SunshineDateUtils;
    import com.example.freewaresys.sunshine.sunshineUtils.SunshineWeatherUtils;


    public class DetailsFragment extends Fragment implements
    LoaderManager.LoaderCallbacks<Cursor> {
    public static final String FRAGMENT_KEY = "URI";

    public static final String[] WeatherDetailsProjection = {
            WeatherContract.WeatherEntry.COLUMN_DATE,
            WeatherContract.WeatherEntry.COLUMN_TEMP_MAX,
            WeatherContract.WeatherEntry.COLUMN_TEMP_MIN,
            WeatherContract.WeatherEntry.COLUMN_WEATHER_CONDITION,
            WeatherContract.WeatherEntry.COLUMN_HUMIDITY,
            WeatherContract.WeatherEntry.COLUMN_PRESSURE,
            WeatherContract.WeatherEntry.COLUMN_WIND_SPEED
    };
    public static final int INDEX_WEATHER_DATE = 0;
    public static final int INDEX_TEMP_MAX = 1;
    public static final int INDEX_TEMP_MIN = 2;
    public static final int INDEX_WEATHER_CONDITION = 3;
    public static final int INDEX_WEATHER_HUMIDITY = 4;
    public static final int INDEX_WEATHER_PRESSURE = 5;
    public static final int INDEX_WEATHER_WIND_SPEED = 6;




    public static final int LOADER_ID = 23;
    private Uri mUri;

    TextView date;
    TextView weatherDescrirption;
    ImageView weatherIcon;
    TextView highTemperature;
    TextView lowTemperature;
    TextView humidity;
    TextView pressure;
    TextView windMeasurement;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String uriString = bundle.getString(FRAGMENT_KEY);
        mUri = Uri.parse(uriString);
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_details, container, false);
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        date = (TextView) getActivity().findViewById(R.id.date);
        weatherDescrirption = (TextView) getActivity().findViewById(R.id.weather_description);
        weatherIcon = (ImageView) getActivity().findViewById(R.id.weather_icon);
        lowTemperature = (TextView) getActivity().findViewById(R.id.low_temperature);
        highTemperature = (TextView) getActivity().findViewById(R.id.high_temperature);
        humidity = (TextView) getActivity().findViewById(R.id.humidity);
        pressure = (TextView) getActivity().findViewById(R.id.pressure);
        windMeasurement = (TextView) getActivity().findViewById(R.id.wind_measurement);
        getActivity().getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        if (id != LOADER_ID) {
            return null;
        }

        return new CursorLoader(getActivity(),
                mUri,
                WeatherDetailsProjection,
                null,
                null,
                null
        );
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor mCursor) {
        boolean cursorHasValidData = false;
        if (mCursor != null && mCursor.moveToFirst()) {
        /* We have valid data, continue on to bind the data to the UI */
            cursorHasValidData = true;
        }

        if (!cursorHasValidData) {
        /* No data to display, simply return and do nothing */
            return;
        }
        long datee = mCursor.getLong(INDEX_WEATHER_DATE);
        String friendlyDate = SunshineDateUtils.getFriendlyDateString(getActivity(), datee);
        date.setText(friendlyDate);
        String condition = mCursor.getString(INDEX_WEATHER_CONDITION);
        weatherDescrirption.setText(condition);
        int weatherImageResource = SunshineWeatherUtils.getLargeArtResourceIdForWeatherCondition(condition);
        weatherIcon.setImageResource(weatherImageResource);
        double maxTemp = mCursor.getDouble(INDEX_TEMP_MAX);
        String maxTemprature = SunshineWeatherUtils.formateTemperature(getActivity(), maxTemp);
        highTemperature.setText(maxTemprature);
        double minTemp = mCursor.getDouble(INDEX_TEMP_MIN);
        String minTemprature = SunshineWeatherUtils.formateTemperature(getActivity(), minTemp);
        lowTemperature.setText(minTemprature);
        float humidityy = mCursor.getFloat(INDEX_WEATHER_HUMIDITY);
        String weathereHumidity = String.format(this.getString(R.string.format_humidity), humidityy);
        humidity.setText(weathereHumidity);
        float pressuree = mCursor.getFloat(INDEX_WEATHER_PRESSURE);
        String weatherePressure = String.format(this.getString(R.string.format_pressure), pressuree);
        pressure.setText(weatherePressure);
        float wind = mCursor.getFloat(INDEX_WEATHER_WIND_SPEED);
        String weathereWind = String.format(this.getString(R.string.format_wind_kmh), wind);
        windMeasurement.setText(weathereWind);


    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }
    }

my details fragment layout

<?xml version="1.0" encoding="utf-8"?>

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


    <include
        android:id="@+id/primary_info"
        layout="@layout/primary_weather_info"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <include
        android:id="@+id/extra_details"
        layout="@layout/extra_weather_details"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>

my logcat

.freewaresys.sunshine E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.freewaresys.sunshine, PID: 23552
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.freewaresys.sunshine/com.example.freewaresys.sunshine.DetailsActivity}: android.view.InflateException: Binary XML file line #4: Error inflating class fragment
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                                  at android.os.Looper.loop(Looper.java:193)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5333)
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
                                                                                  at dalvik.system.NativeStart.main(Native Method)
                                                                               Caused by: android.view.InflateException: Binary XML file line #4: Error inflating class fragment
                                                                                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
                                                                                  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:341)
                                                                                  at android.app.Activity.setContentView(Activity.java:1948)
                                                                                  at com.example.freewaresys.sunshine.DetailsActivity.onCreate(DetailsActivity.java:12)
                                                                                  at android.app.Activity.performCreate(Activity.java:5343)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) 
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                                  at android.os.Looper.loop(Looper.java:193) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5333) 
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
                                                                                  at dalvik.system.NativeStart.main(Native Method) 
                                                                               Caused by: java.lang.NullPointerException
                                                                                  at com.example.freewaresys.sunshine.DetailsFragment.onCreateView(DetailsFragment.java:66)
                                                                                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
                                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1255)
                                                                                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1472)
                                                                                  at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1691)
                                                                                  at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3440)
                                                                                  at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
                                                                                  at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:378)
                                                                                  at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:33)
                                                                                  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
                                                                                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
                                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
                                                                                  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:341) 
                                                                                  at android.app.Activity.setContentView(Activity.java:1948) 
                                                                                  at com.example.freewaresys.sunshine.DetailsActivity.onCreate(DetailsActivity.java:12) 
                                                                                  at android.app.Activity.performCreate(Activity.java:5343) 
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331) 
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429) 
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                                  at android.os.Looper.loop(Looper.java:193) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5333) 
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
                                                                                  at dalvik.system.NativeStart.main(Native Method) 

In your DetailsFragment class use the fragment's view to reference the items...move code from onActivityCreated to onCreateView()

Code snippet:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_details, container, false);
    Bundle bundle = this.getArguments();
    String uriString = bundle.getString(FRAGMENT_KEY);
    mUri = Uri.parse(uriString);
    // Inflate the layout for this fragment
    date = (TextView) v.findViewById(R.id.date);
    weatherDescrirption = (TextView) v.findViewById(R.id.weather_description);
    weatherIcon = (ImageView) v.findViewById(R.id.weather_icon);
    lowTemperature = (TextView) v.findViewById(R.id.low_temperature);
    highTemperature = (TextView) v.findViewById(R.id.high_temperature);
    humidity = (TextView) v.findViewById(R.id.humidity);
    pressure = (TextView) v.findViewById(R.id.pressure);
    windMeasurement = (TextView) v.findViewById(R.id.wind_measurement);
    getActivity().getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    return v;
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

You have to add Fragment class name for your <fragment>

<?xml version="1.0" encoding="utf-8"?>
<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    class="com.example.freewaresys.sunshine.DetailsFragment"
    android:id="@+id/activity_details_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Could you please try by adding

<meta-data android:name="com.google.android.gms.version"

android:value="@integer/google_play_services_version" />

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM