代码之家  ›  专栏  ›  技术社区  ›  GosiaK

两个对话片段之间的通信

  •  0
  • GosiaK  · 技术社区  · 8 年前

    AddAlarmDialogFragment )使用自定义布局,单击TextView后将启动另一个 TimePickerFragment .

        @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
    
        return new TimePickerDialog(getActivity(),TimePickerDialog.THEME_HOLO_LIGHT, this, hour, minute,
                true);
    
    }
    

    我让TimePickerFragment实现 TimePickerDialog.OnTimeSetListener, onTimeSet(TimePicker view, int hourOfDay, int minute) .

        public interface OnTimePickedListener {
         void timePicked(int hour, int minutes);
    }
    

    方法 timePicked(int hour, int minutes) onTimeSet(时间选择器视图,int hourOfDay,int minute)

    这是回调的全部代码

            @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            OnTimePickedListener onTimePickedListener=
    OnTimePickedListener)getParentFragment();
            onTimePickedListener.timePicked(hourOfDay,minute);
        }
    

    这里有一个问题,我想从中消磨时间 TimePickerDialog 添加AlarmDialogFragment ,因此启动的DialogFragment 时间选择器碎片

    有没有办法从父dialogFragment获取此接口的实例。或者也许有更好的方式在这两个组件之间提供通信,因为对我来说 OnTimePickedListener TimePickerDialog.OnTimeSetListener 似乎不知道是什么让代码变得干净。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Jon    8 年前

    getParentFragment() 因为你正在使用 FragmentManager Activity . 为了 要工作,你需要使用 getChildFragmentManager()

    然而,出于您的目的,您应该只利用片段标记功能并找到您要查找的片段:

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Fragment fragment = getActivity().getSupportFragmentManager()
           .findFragmentByTag(TimePickerFragment.TAG);
    
        if (fragment == null) {
            // the fragment we're looking for doesn't exist
            return;
        }
    
        try {
            OnTimePickedListener onTimePickedListener=(OnTimePickedListener)fragment;
            onTimePickedListener.timePicked(hourOfDay,minute);
        } catch (ClassCastException e) {
            // the fragment we're looking for doesn't implement the proper callback
            throw new ClassCastException(fragment.toString()
                    + " must implement OnTimePickedListener");
        }
    }
    
        2
  •  0
  •   ApriOri    8 年前

    如果不在应用程序的不同部分之间传递引用,则很少有方法在应用程序的不同部分之间进行通信。(解耦)

    如果您认为您的代码将增长,并且您将有两个组件相互对话,那么您可能需要考虑一个完整的解决方案。 您可以使用android LocalBroadcastManager或更推荐的eventbus实现来实现这一点。 事件总线几乎没有替代方案。