android - 带有监听器的通用 DialogFragment

标签 android android-fragments android-dialogfragment dialogfragment

我想创建一个可以在我的应用程序中重复使用的 DialogFragment 子类。因此,当 Activity 想要创建 DialogFragment 时,它可以设置自己的文本并为正负按钮附加自己的监听器。对于 DialogFragment 中的文本,我使用参数包将它们传递给 fragment ,以确保它们在配置更改时保持不变。但是,不能将按钮的监听器传递给带有这些参数的 fragment 。

将这些监听器附加到 DialogFragment 且不会在配置更改时丢失它们的最佳做法是什么?

最佳答案

BaseDialogFragment.java

public abstract class BaseDialogFragment extends AppCompatDialogFragment {
public AppCompatDialog dialog;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(getLayoutResource(), null);
    ButterKnife.bind(this, view);
    return view;
}


@Override
public void onStart() {
    super.onStart();
    dialog = (AppCompatDialog) getDialog();
    if (dialog != null) {
        WindowManager windowManager =
                (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;

        dialog.getWindow().setLayout(width - 75, ViewGroup.LayoutParams.WRAP_CONTENT);
        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
        dialog.getWindow().setAttributes(params);
        dialog.getWindow().setBackgroundDrawable(ContextCompat.getDrawable(getContext(), R.drawable.dialog_rounded_back));
    }

}

protected abstract int getLayoutResource();

@Override
public void show(FragmentManager manager, String tag) {

    try {
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commitAllowingStateLoss();
    } catch (IllegalStateException e) {

    }
}

}

子 fragment 对话框:

public class InvitationAcceptRejectDialog extends BaseDialogFragment {
public InvitationAcceptRejectDialog() {

}

@Override
protected int getLayoutResource() {
    return R.layout.invite_accept_reject_dialog;
}

protected OnDialogClickListener alertListener;


@BindView(R.id.tvDialogTitle)
AppCompatTextView tvDialogTitle;
@BindView(R.id.tvDialogMessage)
AppCompatTextView tvDialogMessage;
int requestCode;
public String dialogTitle;
public String dialogMessage;
public Bundle bundle;

@OnClick({R.id.imgCloseDialog, R.id.btnYes, R.id.btnNo})
public void dialgClick(View view) {
    switch (view.getId()) {
        case R.id.imgCloseDialog:
            break;
        case R.id.btnYes:
            alertListener.onPositiveClick(dialog, requestCode, bundle);
            break;
        case R.id.btnNo:
            alertListener.onNegativeClick(dialog, requestCode, bundle);
            break;
    }
    dialog.dismiss();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    tvDialogTitle.setText(dialogTitle);
    tvDialogMessage.setText(dialogMessage);
}

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

}

public static class Builder {

    InvitationAcceptRejectDialog alertDialogFragment;

    public Builder() {
        alertDialogFragment = new InvitationAcceptRejectDialog();
    }

    public Builder setTitle(String title) {
        alertDialogFragment.dialogTitle = title;
        return this;
    }

    public Builder setMessage(String message) {
        alertDialogFragment.dialogMessage = message;
        return this;
    }

    public Builder setBundel(Bundle bundel) {
        alertDialogFragment.bundle = bundel;
        return this;
    }

    public Builder setCallback(OnDialogClickListener mListener, int code) {
        alertDialogFragment.alertListener = mListener;
        alertDialogFragment.requestCode = code;
        return this;
    }

    public InvitationAcceptRejectDialog build() {
        return alertDialogFragment;
    }
}
}

activityfragmnet 中的实现:

  InvitationAcceptRejectDialog build = new InvitationAcceptRejectDialog.Builder()
            .setCallback(this, Constant.DialogConstant.ACCEPET_INVITE)
            .setTitle(getString(R.string.logout))
            .setMessage(getString(R.string.logout_message))
            .build();
    build.show(getSupportFragmentManager(), "TAG");

处理正负按钮点击的接口(interface):

public interface OnDialogClickListener {

void onPositiveClick(DialogInterface dialog, int id, Bundle bundle);

void onNegativeClick(DialogInterface dialog, int id, Bundle bundle);

}

关于android - 带有监听器的通用 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694658/

相关文章:

java - 为什么在数据库 android 中进行查询后调用 moveToFirst()

Android ActionBar 菜单不重绘菜单项

java - .java 代码中的 fragment 更改在哪里?

java - 每当我重新单击或导航到下一个 fragment 时,我的 fragment 都会不断重新创建

android - Activity 被杀死后恢复多个 DialogFragment

android - Android 中TabHost 的所有选项卡中常见的底部布局?

android - Google Cloud Vision在android studio中产生重复文件

java - 可以以编程方式格式化通过 stringBuffer.append() 附加的文本吗?

具有 AppCompat 主题问题的 Android DialogFragment

Android重新显示来自单独 fragment 的dialogfragment