6 votes

Forcer la fermeture lorsque l'orientation change avec la date ouverte DialogueFragment

J'ai une activité et tout ce que je veux c'est

Activity--> OnClick of Some layout (That has textview)-->Open Datepicker--> définir la valeur sélectionnée dans txtvalue

Je veux accéder au Datepicker en utilisant le DialogFragment avec le code ci-dessous.

package com.app.ourforms.date;

import java.util.Calendar;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.TextView;

public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {

    TextView txt;

    public DatePickerFragment() {
    }

    public DatePickerFragment(TextView txt) {
        this.txt = txt;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceSateate) {

        Log.i("TAG", "Inside onCreateDialog");
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        Log.i("TAG", "Inside onDateSet");
        txt.setText(day + "/" + (month + 1) + "/" + year);
        // Do something with the date chosen
    }
}

Le code ci-dessus fonctionne bien lorsque l'appareil ne change pas d'orientation. Mais lorsque le Datepicker est affiché et que l'orientation change, j'obtiens une fermeture forcée comme ci-dessous.

01-04 07:34:14.580: E/AndroidRuntime(2375): FATAL EXCEPTION: main
01-04 07:34:14.580: E/AndroidRuntime(2375): java.lang.NullPointerException
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.app.ourforms.date.DatePickerFragment.onDateSet(DatePickerFragment.java:39)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.os.Looper.loop(Looper.java:137)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at java.lang.reflect.Method.invokeNative(Native Method)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at java.lang.reflect.Method.invoke(Method.java:511)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-04 07:34:14.580: E/AndroidRuntime(2375):     at dalvik.system.NativeStart.main(Native Method)

Voici ma méthode pour appeler DatePickerFragment

public void showDatePickerDialog(View v) {
        Log.i("TAG", "Inside showDatePickerDialog");
        DialogFragment newFragment = new DatePickerFragment((TextView)v);
        newFragment.show(getFragmentManager(), "datePicker");
    }

S'il vous plaît, aidez-moi à m'en sortir. Merci d'avance.

3voto

Yog Guru Points 1438

Je ne suis pas sûr que cette solution vous convienne, mais vous pouvez l'essayer.

Le problème auquel vous êtes confronté est que votre activité se recharge à chaque fois que votre orientation change. Vous pouvez appeler OnConfigurationchanged() et dans le fichier Menifest, vous pouvez définir Configuchanges à orientation|screensize

En faisant cela, votre activité ne se chargera pas lors des changements d'orientation et vous ne serez pas plus longtemps confronté au problème que vous rencontrez actuellement.

Peut vous aider.

1voto

Akos Cz Points 3880

Votre référence TextView est nulle. Le NPE se trouve à la ligne 39 de votre DatePickerFragment. La raison pour laquelle il est nul est que, lorsque l'orientation change, la hiérarchie de vue entière est recréée et la référence au TextView que vous avez transmise à votre DatePickerFragment n'existe plus.

Au lieu de passer l'instance du TextView, essayez de passer l'ID du TextView.

new DatePickerFragment(v.getId());

Ensuite, mettez en œuvre

public Bundle onSaveInstanceState ()

y

public void onRestoreInstanceState (Bundle savedInstanceState)

pour enregistrer et restaurer l'ID de votre TextView lorsque votre DatePickerDialog est détruit et recréé.

Vous devrez alors utiliser

getActivity().findViewById(your_text_view_ID)

pour trouver votre instance TextView dans la hiérarchie des vues, afin de pouvoir définir son texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X