1

我有以下DialogFragment挑日期:如何从调用片段中的DialogFragment中获取结果?

public class Fragment_Picker_Time extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 

int hour; 
int minute; 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current time as the default values for the picker 
    final Calendar c = Calendar.getInstance(); 
    hour = c.get(Calendar.HOUR_OF_DAY); 
    minute = c.get(Calendar.MINUTE); 

    // Create a new instance of TimePickerDialog and return it 
    return new TimePickerDialog(getActivity(), this, hour, minute, 
      DateFormat.is24HourFormat(getActivity())); 
} 

public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    // Do something with the time chosen by the user 
} 
} 

这就是我如何把它从另一个片段:

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
    case R.id.btn_call_time: 
     DialogFragment newFragment = new Fragment_Picker_Time(); 
     newFragment.show(getFragmentManager(), "timePicker"); 
     break; 
    } 
} 

但是我不知道如何从DialogFragment获取值并传递给我的片段。我试过如下:

在我的onTimeSet功能设置DialogFragment:

public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    Intent intent = new Intent(getParentFragment().getActivity(), Fragment_Schedules.class); 
    intent.putExtra("HOUR", hour); 
    intent.putExtra("MINUTE", minute); 
    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent); 
} 

增加了以下行来调用这个片段:

case R.id.btn_call_time: 
     DialogFragment newFragment = new Fragment_Picker_Time(); 
     newFragment.setTargetFragment(this, 55); 
     newFragment.show(getFragmentManager(), "timePicker"); 
     break; 
    } 

并设置OnActivityResult功能:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    getActivity(); 
    //super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode==Activity.RESULT_OK) 
    { 
     switch(requestCode) 
     { 
     case 55: 
      int hour = data.getExtras().getInt("HOUR"); 
      int minute = data.getExtras().getInt("MINUTE"); 
      Toast.makeText(getActivity(), "The selected time is: "+hour+":"+minute, Toast.LENGTH_LONG).show(); 
      break; 
     } 
    } else { 
     // handle error 
    } 
} 

但是当我试图运行它时,我的应用程序崩溃了。这是我在logcat得到的:

09-29 10:06:43.666: E/AndroidRuntime(14088): FATAL EXCEPTION: main 
09-29 10:06:43.666: E/AndroidRuntime(14088): java.lang.NullPointerException 
09-29 10:06:43.666: E/AndroidRuntime(14088): at com.myname.myproject.fragments. 
    Fragment_Picker_Time.onTimeSet(Fragment_Picker_Time.java:32) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at android.app.TimePickerDialog 
    .onClick(TimePickerDialog.java:119) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at com.android.internal.app.AlertController$ButtonHandler 
    .handleMessage(AlertController.java:166) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at android.os.Looper.loop(Looper.java:137) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at android.app.ActivityThread.main(ActivityThread.java:4424) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at java.lang.reflect.Method.invoke(Method.java:511) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-29 10:06:43.666: E/AndroidRuntime(14088): at dalvik.system.NativeStart.main(Native Method) 

我在做什么错?我如何将选定的值从DialogFragment传递给Fragment?

回答

1

你只需要创建一个Inteface,你的Fragment应该实现它。

public interface OnTimeDialogListener { 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute);  
} 

下面是代码

public class Fragment_Picker_Time extends DialogFragment implements TimePickerDialog.OnTimeSetListener { 


public interface OnTimeDialogListener { 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute);  
} 

int hour; 
int minute; 

OnTimeDialogListener mListener;  

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

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current time as the default values for the picker 
    final Calendar c = Calendar.getInstance(); 
    hour = c.get(Calendar.HOUR_OF_DAY); 
    minute = c.get(Calendar.MINUTE); 

    // Create a new instance of TimePickerDialog and return it 
    return new TimePickerDialog(getActivity(), this, hour, minute, 
     DateFormat.is24HourFormat(getActivity())); 
} 

public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     mListener.onTimeSet(TimePicker view, int hourOfDay, int minute); 
} 
} 
+1

我试图实现它在我的片段,但该应用程序崩溃,说我必须在我的主要FragmentActivity中实现它。我确实设法在那里实现它,但是现在我需要再次将变量传递给我的Fragment。有没有办法将值直接传递给我的片段? – Igal

+0

你可以分享代码吗? –

+0

请参阅此链接:http://developer.android.com/guide/topics/ui/dialogs.html –

1

尝试改变符合mListener:

mListener=(...Listener)activity.getFragmentManager().findFragmentById(int RESOURCE); 

其中brakets的最后一件事是在主要活动中的片段的ID .. 。例如R.id.planList。并在括号中的第一件事情就是你的监听器的名称,例如,NewPlanNameListener

比它的点击确实直接到片段,而不是活动

相关问题