Общий DialogFragment со слушателями - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать DialogFragment подкласс, который можно повторно использовать в моем приложении.Поэтому, когда Activity хочет создать DialogFragment, он может установить свои собственные тексты и присоединить своих собственных слушателей к кнопкам плюса и минуса.Для текстов внутри DialogFragment я передаю их фрагменту, используя пакет аргументов, чтобы убедиться, что они сохраняются при изменении конфигурации.Тем не менее, слушатели для кнопок не могут быть переданы во фрагмент с этими аргументами.

Что было бы лучше, чтобы присоединить этих слушателей к DialogFragment, не теряя их при изменении конфигурации?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Относительно передачи слушателей, вы можете создать интерфейс с двумя функциями, каждая для положительной и отрицательной кнопки в вашем DialogFragment.Внутри слушателей кликов ваших положительных и отрицательных кнопок вы можете вызывать эти методы интерфейса соответственно.Создайте метод внутри вашего DialogFragment для установки этого интерфейса.

0 голосов
/ 05 июня 2018

Я бы сделал что-то вроде этого: используйте кнопки в качестве интерфейсов, и вы можете вызывать этот класс в любом месте вашего проекта.и вы также можете сохранить его экземпляр при изменении конфигурации:

public class MyDialogFragment extends DialogFragment  {

// the fragment initialization parameters,
private static final String DIALOG_TITLE = "DIALOG_TITLE";
private static final String DIALOG_MESSAGE = "DIALOG_MESSAGE";
private static final String DIALOG_BUTTON_POSITIVE = "DIALOG_BUTTON_POSITIVE";
private static final String DIALOG_BUTTON_NEGATIVE = "DIALOG_BUTTON_NEGATIVE";

private String Title;
private String Message;
private String btnPositive;
private String btnNegative;

public interface DialogFragmentButtonPressedListener {
    void onPositiveButtonClick();

    void onNegativeButtonClick();

}


public static MyDialogFragment newInstance(String title, String message, String btnPositiveText, String btnNegativeText) {
    MyDialogFragment fragment = new MyDialogFragment();
    Bundle args = new Bundle();
    args.putString(DIALOG_TITLE, title);
    args.putString(DIALOG_MESSAGE, message);
    args.putString(DIALOG_BUTTON_POSITIVE, btnPositiveText);
    args.putString(DIALOG_BUTTON_NEGATIVE, btnNegativeText);

    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        Title = getArguments().getString(DIALOG_TITLE);
        Message = getArguments().getString(DIALOG_MESSAGE);
        btnPositive = getArguments().getString(DIALOG_BUTTON_POSITIVE);
        btnNegative = getArguments().getString(DIALOG_BUTTON_NEGATIVE);

    }

}

// updated this method. before update it was onAttach(Activity activity)
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (!(context instanceof DialogFragmentButtonPressedListener)) {
        throw new ClassCastException(context.toString() + " must implement DialogFragmentButtonPressedListener");
    }
}

static Handler handler = new Handler(Looper.getMainLooper());

final Runnable runnable = new Runnable( ) {
    @Override
    public void run() {
        if (mAlertDialog.isShowing()) {
            mAlertDialog.dismiss();

        }
    }
};

AlertDialog mAlertDialog = null;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

//        return new AlertDialog.Builder(getActivity())
//                .setTitle(Title)
//                .setMessage(Message)
//                .setPositiveButton(btnPositive, new DialogInterface.OnClickListener() {
//
//                    @Override
//                    public void onClick(DialogInterface dialog, int which) {
//                        ((DialogFragmentButtonPressedListener) getActivity()).onPositiveButtonClick();
//                    }
//                })
//                .setNegativeButton(btnNegative, new DialogInterface.OnClickListener() {
//
//                    @Override
//                    public void onClick(DialogInterface dialog, int which) {
//                        ((DialogFragmentButtonPressedListener) getActivity()).onNegativeButtonClick();
//                    }
//                })
//                .create();


    return mAlertDialog;
}
 }

И в своей деятельности по вызову я бы сделал так:

 new MyDialogFragment();
 myDialogFragment = MyDialogFragment.newInstance("successfull", "Please follow the instructions", " OK ", "negativeButtonText");
  myDialogFragment.show(getSupportFragmentManager(), "MyDialogFragment");
0 голосов
/ 05 июня 2018

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) {

    }
}

}

Диалог дочернего фрагмента:

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;
    }
}
}

Реализация в активность или fragmnet :

  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");

Интерфейс для ручки положительного и отрицательного нажатия кнопки:

public interface OnDialogClickListener {

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

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

}
...