【问题标题】:Calling a method in a fragment from a separate class从单独的类调用片段中的方法
【发布时间】:2014-04-24 07:26:12
【问题描述】:

在不同类的片段中调用方法的最佳方式是什么?我通过getActivity() 将上下文传递到班级。类似于

((Fragment) ((Activity) context).getMainFragment()).Method();

这看起来不太对......

【问题讨论】:

    标签: android fragment android-context


    【解决方案1】:

    我认为你可以这样做:

    创建接口OnMyDialogClickListener和类MyDialogFragment,会调用创建接口的方法

    
    public class MyDialogFragment extends DialogFragment {
    
    
    private OnMyDialogClickListener listener;
    
    public static DialogFragment newInstance(OnMyDialogClickListener listener) {
        DialogFragment fragment = new MyDialogFragment(listener);
        return fragment;
    }
    
    private MyDialogFragment(OnMyDialogClickListener listener) {
        this.listener = listener;
    }
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        ....
        dialog.findViewById(R.id.button).setOnClickListener(new DialogButtonsClickListener);
        return dialog
    }
    
    private final class DialogButtonsClickListener implements View.OnClickListener {
    
        @Override
        public void onClick(View view) {
           listener.Method();
        }
    }
    
    public static interface OnMyDialogClickListener {
    
        void Method();
    
    }
    

    }


    在目标片段中实现接口:

    
    public class AlbumsFragment extends BaseFragment implements OnMyDialogClickListener {
    
        .....
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
           //show dialog
            DialogFragment myDialogFragment = MyDialogFragment.newInstance(this);
            myDialogFragment.show(getFragmentManager(), ALBUM_ACTION_TAG);
        }
    
        @Override
        public void Method() {
             //some code
        }
    }
    

    【讨论】:

      【解决方案2】:

      这取决于你在做什么。

      如果操作是从 Fragment 发出的,则应将 Fragment 实例传递给执行该操作的类或方法。

      如果这是一个像“用户退出”或“SD卡被移除”这样的事件,你应该发送一个本地广播并在片段中注册一个广播接收器。

      【讨论】:

      • 这个类可以从活动中定义一个接口吗?然后将实现传递给它?
      【解决方案3】:

      我经常使用的两种方法:

      //#1 interface method in turn calls fragment;
      ((SomeInteraceOrSuperClass) getActivity).intefaceMethod();
      
      
      //#2 hashmap = fragment directory;
      TitleFrag titlefrag = (TitleFrag) getActivity().m_mapFrags.get(KEY_TITLEFRAG);
      titleFrag.method();
      

      【讨论】:

        【解决方案4】:

        这样 -> https://developer.android.com/training/basics/fragments/communicating.html(接口和魔法)

        请经常检查 Android 开发人员。它包含许多关于良好实践的遮阳篷。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-05
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多