Android “Best Practice” returning values from a dialog

后端 未结 6 1643
闹比i
闹比i 2020-12-07 18:27

What is the \"correct\" way to return the values to the calling activity from a complex custom dialog - say, text fields, date or time picker, a bunch of radio buttons, etc,

6条回答
  •  南方客
    南方客 (楼主)
    2020-12-07 19:09

    After quite a bit of research I settled on a callback interface. My code is as follows:

    MyFragment.java

    public class MyFragment extends Fragment {
    

    ...

    private void displayFilter() {
    
        FragmentManager fragmentManager = getFragmentManager();
    
        FilterDialogFragment filterDialogFragment = new FilterDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("listener", new FilterDialogFragment.OnFilterClickListener() {
            @Override
            public void onFilterClickListener() {
                System.out.println("LISTENER CLICKED");
    
            }
        });
        filterDialogFragment.setArguments(bundle);
        filterDialogFragment.show(fragmentManager, DIALOG_FILTER);
    
    }
    

    MyDialog.java

    public class MyDialog extends DialogFragment {
    
    private ImageButton mBtnTest;
    private OnFilterClickListener mOnFilterClickListener;
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View filterLayout = inflater.inflate(R.layout.filter_dialog, null);
        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(filterLayout)
                .setTitle("Filter");
    
        Dialog dialog = builder.create();
    
        mOnFilterClickListener = (OnFilterClickListener) getArguments().getSerializable("listener");
    
        mBtnTest = (ImageButton)filterLayout.findViewById(R.id.fandb);
        mBtnTest.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mOnFilterClickListener.onFilterClickListener();
                dismiss();
            }
        });
    
        return dialog;
    }
    
    public interface OnFilterClickListener extends Serializable {
        void onFilterClickListener();
    }
    
    }
    

提交回复
热议问题