0

Ich habe eine DateandTimePickerDialogueFragment erstellt und rufe die DateandTimePickerDialogueFragment von MainActivity an.So geben Sie Dialogfragmente Ergebniswerte zurück

Mein Problem ist, wie kann ich die DateandTimePickerDialogueFragment Ergebniswerte an MainActivity senden.

MainActivity:

@Override 
public void onClick(View v) { 

    if (v.getId() == R.id.buttonid) { 

     DateandTimePickerDialogueFragment dateandTimePickerDialogueFragment = new DateandTimePickerDialogueFragment(); 
     dateandTimePickerDialogueFragment.show(getSupportFragmentManager(), "DateandTimePickerDialogueFragment"); 
    } 
} 

DateandTimePickerDialogueFragment:

public class DateandTimePickerDialogueFragment extends DialogFragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return displayDateDialogPicker(getActivity()); 
    } 

    /** 
    * @param context 
    */ 
    private Dialog displayDateDialogPicker(Context context) { 

     int mYear, mMonth, mDay; 
     final Calendar c = Calendar.getInstance(); 
     mYear = c.get(Calendar.YEAR); 
     mMonth = c.get(Calendar.MONTH); 
     mDay = c.get(Calendar.DAY_OF_MONTH); 

     DatePickerDialog dpd = new DatePickerDialog(context, 
       new DatePickerDialog.OnDateSetListener() { 

        @Override 
        public void onDateSet(DatePicker view, int year, 
              int monthOfYear, int dayOfMonth) { 
         int mymonth = monthOfYear + 1; 
         String mmmMonth = "", mmDate = ""; 
         if (mymonth > 0 && mymonth < 10) { 

          mmmMonth = "0" + mymonth; 

         } else { 

          mmmMonth = "" + mymonth; 
         } 

         if (dayOfMonth > 0 && dayOfMonth < 10) { 
          mmDate = "0" + dayOfMonth; 
         } else { 

          mmDate = "" + dayOfMonth; 
         } 
         //YYYY-MM-DD 
         String finalDate = year + "-" + (mmmMonth) + "-" + mmDate; 

         Intent intentData = new Intent(); 
         intentData.putExtra("Date", finalDate); 

         getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intentData); 
        } 
       }, mYear, mMonth, mDay); 
     dpd.show(); 
     return dpd; 
    } 
} 
+0

Können Sie eine Methode schreiben, um Ihre Klassenvariablen zu aktualisieren, um Ergebnisse zu erhalten? – Eenvincible

Antwort

0

In Ihrem DialogFragment können Sie Schnittstelle für diese

ersetzen vollständigen Code mit folgenden Code

machen
public class DateandTimePickerDialogueFragment extends DialogFragment { 
public static interface OnCompleteListener { 
    public abstract void onComplete(String time); 
} 

private OnCompleteListener mListener; 
// make sure the Activity implemented it 

public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     this.mListener = (OnCompleteListener) activity; 
    } catch (final ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnCompleteListener"); 
    } 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return displayDateDialogPicker(getActivity()); 
} 

/** 
* @param context 
*/ 
private Dialog displayDateDialogPicker(Context context) { 
    mListener = (OnCompleteListener)getActivity(); 
    int mYear, mMonth, mDay; 
    final Calendar c = Calendar.getInstance(); 
    mYear = c.get(Calendar.YEAR); 
    mMonth = c.get(Calendar.MONTH); 
    mDay = c.get(Calendar.DAY_OF_MONTH); 

    DatePickerDialog dpd = new DatePickerDialog(context, 
      new DatePickerDialog.OnDateSetListener() { 

       @Override 
       public void onDateSet(DatePicker view, int year, 
             int monthOfYear, int dayOfMonth) { 
        int mymonth = monthOfYear + 1; 
        String mmmMonth = "", mmDate = ""; 
        if (mymonth > 0 && mymonth < 10) { 

         mmmMonth = "0" + mymonth; 

        } else { 

         mmmMonth = "" + mymonth; 
        } 

        if (dayOfMonth > 0 && dayOfMonth < 10) { 
         mmDate = "0" + dayOfMonth; 
        } else { 

         mmDate = "" + dayOfMonth; 
        } 
        //YYYY-MM-DD 
        String finalDate = year + "-" + (mmmMonth) + "-" + mmDate; 


        mListener.onComplete(finalDate); 
        // getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intentData); 
       } 
      }, mYear, mMonth, mDay); 
    dpd.show(); 
    return dpd; 
} 
} 

Jetzt in Ihrer Aktivität können Sie implements DateandTimePickerDialogueFragment.OnCompleteListener und Methode der Import-Schnittstelle und in dieser Methode können Sie Ihre Daten

@Override 
public void onComplete(String time) { 
    Log.d("TAG", time.toString()); 
} 
+0

Ich erhalte eine Ausnahme wie java.lang.NullPointerException: Versuch, virtuelle Methode 'void android.support.v4.app.Fragment.onActivityResult (int, int, android.content.Intent)' auf eine Null-Objekt Referenz – Krish

+0

i einfügen Ur-Code in meiner MainActivity-Klasse – Krish

+0

versuchen, zuerst zu überprüfen "Intent" ist null oder nicht –

0

erhalten Während keine Schnittstelle verwenden, die eine Methode oder ein valuetype auf Ihrem DialogFragment hält und vor return dpd, fügen Sie diesen dpd in diese variable Schnittstelle ein und implementieren Sie diese Schnittstelle auf Ihrer MainActivity.

0

Sie möchten einen Interface-Listener einrichten.

In Ihrem Dialog Fragmente:

public interface DateandTimeListener { 
     public void OnDateTimeSelected(String date); 
    } 

    private static DateandTimeListener mListener; 

    //Your activity will call this. Passing its context 'this' as the listener. 
    public void setDateandTimeListener(DateandTimeListener listener){ 
     mListener = listener; 
    } 

Dann in Ihrem onDateSet:

public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){ 
....       
String finalDate = year + "-" + (mmmMonth) + "-" + mmDate; 
mListener.OnDateTimeSelected(finalDate); 

.... 
} 

In Ihrem MainActivity:

Achten Sie darauf, den Hörer zu implementieren.

public class MainActivity extends Activity implements DateandTimePickerDialogueFragment.DateandTimeListener 

Dieser wird Sie zwingen die OnDateTimeSelected Callback-Funktion in der Aktivität außer Kraft zu setzen. Von dort erhalten Sie die finalDate-Zeichenfolge, die von Ihrem Dialogfeld zurückgegeben wird.

auch in Ihrer Tätigkeit stellen Sie sicher, setDateandTimeListener(this)

hoffen, dass die Zuhörer einzustellen rufen, das hilft!