2017-10-17 29 views
1

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.

+0

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

+0

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

+0

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

Répondre

0

Ancien grand homme ranch nerd me ramène yep

DatePickerActivity ne sait pas ce que extra_date est. Il n'y a pas de référence dans votre classe, ce n'est pas une variable.

extras habituellement intention vont comme

intent.putExtra (String key, objet Object);

vous avez fait intention.putExtra (EXTRA_DATE, date); ce qui est bien mais dans la classe de récupération, vous devez savoir ce qu'est la valeur EXTRA_DATE.

+0

C'est probablement là que réside mon problème. Ce que j'ai lu ne m'a évidemment pas expliqué, au moins pour moi, comment ces tags doivent être référencés dans les fichiers dans lesquels ils sont utilisés. Je passe en revue mon code pour mettre à jour mon article original pour clarifier comment j'ai référencé EXTRA_DATE les différents fichiers. Je vais ensuite essayer de comprendre comment référencer correctement EXTRA_DATE dans mon code et publier des corrections pour aider les autres. – Jeff

0

Grâce à sdfbhg, AChez9 et Barns52! Vous les avez cloués. Parce que je n'ai pas vraiment compris le problème clé, je n'ai pas correctement identifié la clé EXTRA_DATE. Donc, maintenant pointé dans cette direction, je cherchais un nouveau foyer et trouvé:

naming convention for passing data through extras in android

qui pointait vers:

https://developer.android.com/training/basics/firstapp/starting-activity.html#StartActivity

dans le code de cette page, il y avait la réponse:

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 

Notez que le nom du fichier source fait partie de la clé. Alors, je l'ai changé une ligne dans mon code à DatePickerActivity de:

Date date = (Date) intent.getSerializableExtra(EXTRA_DATE); 

Pour:

Date date = (Date) intent.getSerializableExtra(CrimeFragment.EXTRA_DATE); 

Et le NullPointerException est pas plus parce que je référence maintenant le fichier source dans le fichier de récupération. La leçon est de bien référencer vos clés. Maintenant, je sais que je ne savais pas.

Encore une chose. J'ai expérimenté et constaté que l'ajout: import static com.bignerdranch.android.criminalintent.CrimeFragment.EXTRA_DATE; fourni les informations pour Date date = (Date) intent.getSerializableExtra(EXTRA_DATE); pour fonctionner correctement. Il existe donc deux façons de fournir les informations de référence clés à votre appel d'intention.