Je cherche et trouvee rien à expliquer pourquoi nul est le résultat d'une intention, tels que:Intent passage Date de résultats dans null
How to get Date extra from an intent?
Android: Passing Date in putExra
Il semble que l'intention ne passe rien dans mon code en tant que mon code résulte en une exception NullPointerException (je travaille à travers "Programmation Android" par Big Nerd Ranch):
D'abord, je déclare et définis la clé EXTRA_DATE et crée l'intention dans CrimeFragmen code t (NOTE: c'est le TAG utilisé dans la sortie de LogCat ci-dessous le code), dans l'instruction else:
public static final String EXTRA_DATE = "date";
private static Date date = null;
...
if (small screen) {
//small screen code
} else {
Log.d(TAG, "Large screen: activity");
date = mCrime.getDate();
Log.d(TAG, "date is " + date);
Intent intent = new Intent(getContext(), DatePickerActivity.class);
intent.putExtra(EXTRA_DATE, date);
startActivityForResult(intent, REQUEST_DATE);
}
Comme on peut le voir dans la sortie de LogCat pour cette section de code (ci-dessous), le ' la date » variable a une valeur à ce moment, juste avant de l'envoyer avec intant:
CrimeFragment: Large screen: activity
CrimeFragment: date is Mon Oct 16 18:19:24 CDT 2017
startActivityForResult lance alors DatePickerActivity et entre createFragment (Android studio a suggéré que j'ajouter l'importation, que je l'ai fait):
import static com.bignerdranch.android.criminalintent.DatePickerFragment.EXTRA_DATE;
public class DatePickerActivity extends SingleFragmentActivity {
private final String TAG = "DatePickerActivity";
private static final int REQUEST_DATE = 0;
@Override
protected Fragment createFragment() {
Log.d(TAG, "Entered createFragment");
Date date = (Date) getIntent().getSerializableExtra(EXTRA_DATE);
Log.d(TAG,"date = " + date);
return DatePickerFragment.newInstance(date);
}
Comme il est indiqué dans la déclaration d'importation, DatePickerFragment est mentionnée dans la déclaration d'importation:
public static DatePickerFragment newInstance(Date date){
Log.d(TAG, "Entered newInstance");
Log.d(TAG, "Date is " + date);
Bundle args = new Bundle();
args.putSerializable(EXTRA_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
SingleFragmentActivity est prolongée:
public abstract class SingleFragmentActivity extends AppCompatActivity {
protected abstract Fragment createFragment();
private static final String TAG= "SingleFragmentActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "Entered onCreate");
setContentView(R.layout.activity_fragment);
FragmentManager fm = getSupportFragmentManager();
//fragment_container is the top level FrameLayout in activity_fragment
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null){
fragment = createFragment();
fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
}
}
}
Mais l'intention échoue immédiatement comme indiqué par la ligne de LogCat où « date = null ':
CrimeFragment: Entered onPause
CrimeFragment: Entered onPause
SingleFragmentActivity: Entered onCreate
DatePickerActivity: Entered createFragment
DatePickerActivity: date = null
Cette valeur nULL est maintenant passée à DatePickerFragment:
public class DatePickerFragment extends DialogFragment {
public static final String EXTRA_DATE = "com.bignerdranch.android.criminalintent.date";
private static final String ARG_DATE = "Date";
private static final String TAG = "DatePickerFragment";
private DatePicker mDatePicker;
public static DatePickerFragment newInstance(Date date){
Log.d(TAG, "Entered newInstance");
Log.d(TAG, "Date is " + date);
Bundle args = new Bundle();
args.putSerializable(ARG_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState){
Log.d(TAG, "Entered onCreateView");
Date date = (Date) getArguments().getSerializable(EXTRA_DATE);
Log.d(TAG, "Date equals: " + date);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Jusqu'au NullPointerException se produit:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.bignerdranch.android.criminalintent/com.bignerdranch.
android.criminalintent.DatePickerActivity}: java.lang.NullPointerException:
Attempt to invoke virtual method ‘long java.util.Date.getTime()’ on a null
object reference
Comme on le voit ci-dessus dans la sortie de LogCat pour DatePickerActivity, la variable de date est nulle et si nul est passé de ce moment-là comme on le voit dans l'extrait de LogCat suivant de le code onCreateView ci-dessus.
DatePickerFragment: Entered newInstance
DatePickerFragment: Date is null
DatePickerFragment: Entered onCreateView
DatePickerFragment: Date equals: null
AndroidRuntime: Shutting down VM
A travers toutes mes lectures, y compris tous les postes stackoverflow.com, il semble que cela devrait fonctionner, cette intention doit simplement passer la valeur Date de CrimeFragment à DatePickerFragment, mais elle ne précise pas la valeur de "Date égal à zéro" montre.
Il semble qu'il n'y a rien de plus pour moi à faire, que l'intention devrait juste passer 'date', mais ce n'est pas le cas.
Je ne sais pas ce qu'est 'SingleFragmentActivity', mais juste pour confirmer, vous n'avez pas besoin d'appeler getActivity.getIntent? En outre, êtes-vous sûr que les clés EXTRA_DATE sont exactement les mêmes? – AChez9
Jetez un oeil à la réponse acceptée à cet article: https://stackoverflow.com/questions/6751583/is-there-a-method-that-works-like-start-fragment-for-result – Barns
ACex9 et Barns52, Ce doit être la clé EXTRA_DATE. Je ne comprends vraiment pas comment il doit être référencé dans les différents fichiers de telle sorte que la classe de récupération sache de quoi il s'agit. Je suis en train de mettre à jour le message original pour montrer comment j'ai incorrectement référencé cette clé afin que les autres puissent voir le problème plus clairement et ensuite mettre à jour ceci avec la correction pour aider les autres. – Jeff