如何从Android中的DialogFragment中获取结果?

如何从Android中的DialogFragment中获取结果?,android,dialogfragment,Android,Dialogfragment,我的对话框片段如下代码所示 public class PromoCodeDialogFragment extends BaseDialog implements View.OnClickListener { private Test mBinding; private String mHeader; private String mVehicleNumber; public static PromoCodeD

我的对话框片段如下代码所示

public class PromoCodeDialogFragment extends BaseDialog implements                                           View.OnClickListener {
private Test mBinding;

private String mHeader;
private String mVehicleNumber;

public static PromoCodeDialogFragment newInstance(String mHeader, String mVehicleNumber) {
    PromoCodeDialogFragment dialog = new PromoCodeDialogFragment();
    dialog.mHeader = mHeader;
    dialog.mVehicleNumber = mVehicleNumber;
    return dialog;
}

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

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);

    mBinding = DataBindingUtil.inflate(inflater, R.layout.test, container, false);

    mBinding.title.setText(mHeader);
    setCancelable(true);

    mBinding.submit.setOnClickListener(this);
    mBinding.cancel.setOnClickListener(this);

    return mBinding.getRoot();
}

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.submit:
            submit();

            break;

        case R.id.cancel:
            dismiss();
            break;
    }
}
在这里,如果我按下submit按钮,那么我必须在MainFragment类中获得结果

我这样打电话给DialogFragment

@Override
public void onClick(View view, int position) {
    SearchVehicleResponse.PromotionDetail promotionDetail = mPromoList.get(position);
    if(hasActivity())
    PromoCodeDialogFragment.newInstance(promotionDetail.promotionOffer, mBinding.vehicleId.getText().toString()).show(getActivity().getSupportFragmentManager(), "promo");
}
现在,当我单击PromoCodeDialogFragment内的submit按钮时,我需要在片段中获得响应。

片段类:

public class MyFragment extends Fragment {
int mStackLevel = 0;
public static final int DIALOG_FRAGMENT = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        mStackLevel = savedInstanceState.getInt("level");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("level", mStackLevel);
}

void showDialog(int type) {

    mStackLevel++;

    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
    Fragment prev = getActivity().getFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);

    switch (type) {

        case DIALOG_FRAGMENT:

            DialogFragment dialogFrag = MyDialogFragment.newInstance(123);
            dialogFrag.setTargetFragment(this, DIALOG_FRAGMENT);
            dialogFrag.show(getFragmentManager().beginTransaction(), "dialog");

            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case DIALOG_FRAGMENT:

                if (resultCode == Activity.RESULT_OK) {
                    // After Ok code.
                } else if (resultCode == Activity.RESULT_CANCELED){
                    // After Cancel code.
                }

                break;
        }
    }
}

}
public class MyDialogFragment extends DialogFragment {

public static MyDialogFragment newInstance(int num){

    MyDialogFragment dialogFragment = new MyDialogFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("num", num);
    dialogFragment.setArguments(bundle);

    return dialogFragment;

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.ERROR)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setPositiveButton(R.string.ok_button,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, getActivity().getIntent());
                        }
                    }
            )
            .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, getActivity().getIntent());
                }
            })
            .create();
}
}
DialogFragment类:

public class MyFragment extends Fragment {
int mStackLevel = 0;
public static final int DIALOG_FRAGMENT = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        mStackLevel = savedInstanceState.getInt("level");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("level", mStackLevel);
}

void showDialog(int type) {

    mStackLevel++;

    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
    Fragment prev = getActivity().getFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);

    switch (type) {

        case DIALOG_FRAGMENT:

            DialogFragment dialogFrag = MyDialogFragment.newInstance(123);
            dialogFrag.setTargetFragment(this, DIALOG_FRAGMENT);
            dialogFrag.show(getFragmentManager().beginTransaction(), "dialog");

            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case DIALOG_FRAGMENT:

                if (resultCode == Activity.RESULT_OK) {
                    // After Ok code.
                } else if (resultCode == Activity.RESULT_CANCELED){
                    // After Cancel code.
                }

                break;
        }
    }
}

}
public class MyDialogFragment extends DialogFragment {

public static MyDialogFragment newInstance(int num){

    MyDialogFragment dialogFragment = new MyDialogFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("num", num);
    dialogFragment.setArguments(bundle);

    return dialogFragment;

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.ERROR)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setPositiveButton(R.string.ok_button,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, getActivity().getIntent());
                        }
                    }
            )
            .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, getActivity().getIntent());
                }
            })
            .create();
}
}

我希望这会有帮助

您应该创建这样一个界面:

public interface OnSubmitClickListener {
    void onSubmitClicked(WhateverInfo info);
}
之后,在对话框中添加一个
OnSubmitClickListener
,并将其添加到构造函数中

使您的dialog类看起来像:

private String mHeader;
private String mVehicleNumber;
private OnSubmitClickListener listener;

public static PromoCodeDialogFragment newInstance(String mHeader, String mVehicleNumber, OnSubmitClickListener listener) {
    PromoCodeDialogFragment dialog = new PromoCodeDialogFragment(listener);
    dialog.mHeader = mHeader;
    dialog.mVehicleNumber = mVehicleNumber;
    return dialog;
}

public PromoCodeDialogFragment (OnSubmitClickListener listener) {
    this.listener= listener;
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.submit:
            listener.onSubmitClicked(infoSomething);

            break;

        case R.id.cancel:
            dismiss();
            break;
    }
PromoCodeDialogFragment.newInstance(promotionDetail.promotionOffer, mBinding.vehicleId.getText().toString(), new OnSubmitClickListener(){
        @Override
        public void onSubmitClicked(WhateverInfo info) {
            //get the info from here
        }
    }).show(getActivity().getSupportFragmentManager(), "promo");
你的片段看起来像:

private String mHeader;
private String mVehicleNumber;
private OnSubmitClickListener listener;

public static PromoCodeDialogFragment newInstance(String mHeader, String mVehicleNumber, OnSubmitClickListener listener) {
    PromoCodeDialogFragment dialog = new PromoCodeDialogFragment(listener);
    dialog.mHeader = mHeader;
    dialog.mVehicleNumber = mVehicleNumber;
    return dialog;
}

public PromoCodeDialogFragment (OnSubmitClickListener listener) {
    this.listener= listener;
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.submit:
            listener.onSubmitClicked(infoSomething);

            break;

        case R.id.cancel:
            dismiss();
            break;
    }
PromoCodeDialogFragment.newInstance(promotionDetail.promotionOffer, mBinding.vehicleId.getText().toString(), new OnSubmitClickListener(){
        @Override
        public void onSubmitClicked(WhateverInfo info) {
            //get the info from here
        }
    }).show(getActivity().getSupportFragmentManager(), "promo");

使用接口与片段和对话框进行通信我使用了这种方法,但在对话框片段中,我必须获取输入的文本字段值才能发布到服务器,那么我如何从中获取?无论如何,我使用@Alpesh方法来解决我的问题