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.