重新创建FragmentDialog后重新连接ClickListener

时间:2019-04-03 20:28:32

标签: android android-activity android-dialogfragment dialogfragment onsaveinstancestate

我正在尝试为我的所有 DialogFragments 创建一个 DialogManager 。想法是,我将告诉DialogManager显示具有特定配置的对话框。 DialogManager将显示该特定对话框。 DialogManager是 Singletone

我正在通过“构建器模式”为我想要的对话框构建配置。

这是简单的代码版本。

DialogManager:

public class DialogManager {

  public static DialogManager getInstance(){
    .....................
    .......................
  }

  public void show(FragmentManager fragmentManager, BaseFragment.Builder builder){
      BaseFragment fragment = new BaseFragment();
      fragment.setBuilder(builder);
      fragment.show(fragmentManager, fragment.getClass().getSimpleName());

  }

}

BaseDialog:

public class BaseFragment extends AppCompatDialogFragment {

public void setBuilder(Builder builder){
    type = builder.type;
    clickListener = builder.clickListener;
}

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

    if (type == 1) {
        rootView = inflater.inflate(R.layout.fragment_base, container, false);
    }else if (type == 2){
       rootView =  inflater.inflate(R.layout.dialog_fragmnet2, container, false);
    }else {
        rootView =  inflater.inflate(R.layout.fragment_base, container, false);
    }

    return rootView;
}


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
   // Dialog dialog =  super.onCreateDialog(savedInstanceState);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
            .setPositiveButton("Ok", this.clickListener);
    Dialog dialog = builder.create();


    return dialog;
}



public static class Builder{

    private int type;
    private DialogInterface.OnClickListener clickListener;


    public Builder clickListener(DialogInterface.OnClickListener clickListener){
        this.clickListener = clickListener;
        return this;
    }

    public Builder type(int type){
        this.type = type;
        return this;
    }

}



}

在“活动”中,我正在显示对话框

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            BaseFragment.Builder builder = new BaseFragment.Builder()
                    .type(2)
                    .clickListener(new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });

            DialogManager.getInstance().show(getSupportFragmentManager(), builder);
        }
    });

对于不同类型的对话框,这可以正常工作。但是当重新创建Activity时,我遇到了一个问题。由于我使用的是 DialogFragment ,所以也可以很好地重新创建Dialog。

但是新对话框没有自动创建的监听器。如何将我的自定义 ClickListeners 附加到重新创建的对话框,以便在重新创建Activity后可以捕获事件。

一种解决方案是:如果saveInstanceState不是null,则通过findFragmentByTag方法获取当前重新创建的对话框并手动设置侦听器。但是我不希望Dialog和Activity之间直接通信。我不希望我的BaseDialog取决于特定的活动。我想通过Builder设置所有配置。

还有更好的方法吗?

0 个答案:

没有答案