gpt4 book ai didi

android - 带有监听器的通用 DialogFragment

转载 作者:搜寻专家 更新时间:2023-11-01 08:21:14 25 4
gpt4 key购买 nike

我想创建一个可以在我的应用程序中重复使用的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com