Autore Topic: Datepicker e passaggio dati  (Letto 860 volte)

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Datepicker e passaggio dati
« il: 16 Gennaio 2015, 21:08:17 CET »
0
Salve a tutti ragazzi, in una mia vecchia applicazione avevo utilizzato il vecchio metodo per la creazione di un datepicker dialog, ho visto che però mi è segnata obsoleta. Ho deciso di utilizzare il nuovo metodo, quello che fa uso dei fragment. Ho usato il codice fornito direttamente da Google e ho creato una classe per il fragment:
Codice (Java): [Seleziona]
public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        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);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

E nell'activity che lancia il fragment ho scritto:

Codice (Java): [Seleziona]
DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");

OK, il dialog si apre e nessun problema fin qua. Adesso però farò una domanda banale ma vi assicuro che ho cercato dappertutto su internet ma non ho trovato soluzione: come faccio a far ritornare la data selezionata nel dialog all'activity che lo lancia? L'unica cosa che ho trovato è utilizzare delle interface (?) che però non sono riuscito a gestirle e non ho capito come funzionano e nemmeno fa quello che dovrebbe fare  :-(

Scusate la banalità :(

Grazie a tutti, Damien  :-)
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 717
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Datepicker e passaggio dati
« Risposta #1 il: 20 Gennaio 2015, 15:03:32 CET »
+1
Allo stesso modo di come probabilmente facevi con il vecchio dialog, devi passare un listener per gestire l'evento di selezione data, ad esempio:


Codice (Java): [Seleziona]
public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    private DatePickerDialog.OnDateSetListener dateSetListener = null;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        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);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void show (FragmentManager manager, String tag, DatePickerDialog.OnDateSetListener dateSetListener) {
      super(manager, tag);
      this.dateSetListener = dateSetListener;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        if (dateSetListener != null) {
          dateSetListener(view, year, month, day);
        }
    }
}

e lo invochi con

Codice (Java): [Seleziona]
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker", new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
});
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:Datepicker e passaggio dati
« Risposta #2 il: 20 Gennaio 2015, 19:36:34 CET »
0
Allo stesso modo di come probabilmente facevi con il vecchio dialog, devi passare un listener per gestire l'evento di selezione data, ad esempio:


Codice (Java): [Seleziona]
public static class DatePickerFragment extends DialogFragment
                            implements DatePickerDialog.OnDateSetListener {

    private DatePickerDialog.OnDateSetListener dateSetListener = null;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        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);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void show (FragmentManager manager, String tag, DatePickerDialog.OnDateSetListener dateSetListener) {
      super(manager, tag);
      this.dateSetListener = dateSetListener;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        if (dateSetListener != null) {
          dateSetListener(view, year, month, day);
        }
    }
}

e lo invochi con

Codice (Java): [Seleziona]
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker", new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
});

Innanzitutto ti ringrazio per avermi aiutato, purtroppo però l'ide mi segnala diversi errori :-(
Mi dà errore nel super e addirittura nello static nella dichiarazione della classe, temo magari qualche errore nell'importare le librerie, anche se le ho provate praticamente tutte, ma le posto così magari dai un'occhiata...

Codice (Java): [Seleziona]
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.widget.DatePicker;
import java.util.Calendar;

allego un immagine nella quale segnala l'errore
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 717
  • Respect: +151
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Datepicker e passaggio dati
« Risposta #3 il: 20 Gennaio 2015, 22:55:41 CET »
+1
Sono andato a memoria, probabilmente ho commesso alcuni errori di digitazione, l'importante è che tu abbia capito il concetto, che è il seguente:

- Fai l'override del metodo show in modo che riceva un parametro extra, ossia l'handler che riceverà la notifica
- Quando la data/ora viene selezionata, invochi il metodo dell'handler specificato nel metodo show
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:Datepicker e passaggio dati
« Risposta #4 il: 22 Gennaio 2015, 19:06:07 CET »
0
Sono andato a memoria, probabilmente ho commesso alcuni errori di digitazione, l'importante è che tu abbia capito il concetto, che è il seguente:

- Fai l'override del metodo show in modo che riceva un parametro extra, ossia l'handler che riceverà la notifica
- Quando la data/ora viene selezionata, invochi il metodo dell'handler specificato nel metodo show

Grazie mille gentilissimo :D, questo l'ho capito  :D
A me però serve anche il codice funzionante, non riesco a capire perchè mi dia tutti quegli errori  :-(
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:Datepicker e passaggio dati
« Risposta #5 il: 27 Gennaio 2015, 18:46:29 CET »
0
Ho rivisto nuovamente il codice per implementare un interface per comunicare il dato (mi sembrava il modo più corretto), purtroppo ancora non funziona, pur avendo seguito punto per punto la guida di Google : http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

il codice che ho elaborato comunque è questo, ditemi dove sbaglio:
Codice (Java): [Seleziona]
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import java.util.Calendar;

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    onDataSceltaListener mListener;
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        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);
        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        mListener.onDataScelta(year,month,day);

    }

    public interface OnDataSceltaListener {
        public void onDataScelta(int year, int month, int day);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnDataSceltaListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
}
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:Datepicker e passaggio dati
« Risposta #6 il: 03 Febbraio 2015, 18:45:17 CET »
0
Nessuno riesce a rispondermi? :(
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Datepicker e passaggio dati
« Risposta #7 il: 10 Marzo 2015, 10:32:49 CET »
+1
Dunque, io dopo aver cercato ovunque su internet e fatto dei test delle varie soluzioni sono riuscito a risolvere così:
nella fragmentactivity oncreate ho messo:
Codice: [Seleziona]
EditText casella = (EditText)findViewById(R.id.data_txt);
        casella.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus) {
                    showDatePickerDialog(v);
                }
            }
        });

poi, sempre nello stesso fragment:
Codice: [Seleziona]
public void showDatePickerDialog(View v) {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getSupportFragmentManager(), "datePicker");
    }
    @Override
    public void onDatePicked(int year, int month, int day) { //questa funzione gestisce la data del datepicker che vie restituita separata.
        month++;
        String data = "00".substring(Integer.toString(day).length())+Integer.toString(day)+"/";
        data = data + "00".substring(Integer.toString(month).length())+Integer.toString(month)+"/";
        data = data + Integer.toString(year);
        TextView casella = (TextView)findViewById(R.id.data_txt);
        casella.setText(data);
    }

Ora invece la classe che permette tutto:
Codice: [Seleziona]
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    OnDatePickedListener mCallback;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int day = 0;
        int month = 0;
        int year = 0;
        mCallback = (OnDatePickedListener)getActivity();
        super.onCreate(savedInstanceState);
        Bundle mArgs = getArguments();
        if (mArgs != null) {
            day = mArgs.getInt("day");
            month = mArgs.getInt("month");
            year = mArgs.getInt("year");
        }
        else {
            Calendar c = Calendar.getInstance();
            year = c.get(Calendar.YEAR);
            month = c.get(Calendar.MONTH);
            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) {
        //formattedDate = day+"/"+month+"/"+year;
        if(mCallback != null)
        {
            mCallback.onDatePicked(year, month, day);
        }
    }
    public interface OnDatePickedListener {
        public void onDatePicked(int year, int month, int day);
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            mCallback = (OnDatePickedListener)activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnDatePickedListener.");
        }
    }
}

Probabilmente si può fare di meglio, però considerando che io ci lavoro a tempo perso e che le rifiniture alla mia app le farò dopo che tutto funziona...
;)
Se la mia risposta ti è utile, per favore un thanks!

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:Datepicker e passaggio dati
« Risposta #8 il: 20 Marzo 2015, 19:04:27 CET »
0
Grazie mille, anche io poi avevo risolto facendo in una maniera simile... io andavo a modificare il contenuto di una textview direttamente dal fragment e poi sono andato a leggerlo dall'activity principale. Mi rendo conto pure io che non è il modo più corretto per farlo... Ma non trovando soluzione ho aggirato l'ostacolo... Grazie mille per il contributo  :D
Se ti sono stato d'aiuto premi il tasto THANKS :)