0

I am trying to create a custom dialog using dialogFragment, here I am not be able to display the dialog. The main problem is overriden code is not getting called. Can anyone fix this issue. Here is my code:

BaseDialogFragment.java

public class BaseDialogFragment extends DialogFragment {
    private int layoutId;
    protected Activity mActivity;

    public void setLayoutId(int layoutId){
        this.layoutId = layoutId;
    }

    public BaseDialogFragment(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setStyle(BaseDialogFragment.STYLE_NO_TITLE, R.style.share_dialog);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View v = inflater.inflate(layoutId, container, false);
        return v;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }

    public void initViews(View v){
        getDialog().setCanceledOnTouchOutside(true);
    }
}

CustomDialog.java:

@SuppressLint("ValidFragment")
public class CustomDialog extends BaseDialogFragment  {
    private String message;
    private btnOkClick okClickListerner;
    private TextView simpleMsg;
    private WebView termsConditionWeb;
    private Button okBtn;
    Boolean isNormalDialog = false;
    private Typeface fontClanProBold;
    private View v;
    private Context context;

    public interface btnOkClick{
        void clicked();
    }

    public CustomDialog(String message, btnOkClick okClickListerner, Boolean isNormalDialog){
        this.message = message;
        this.okClickListerner = okClickListerner;
        this.isNormalDialog = isNormalDialog;
        this.mActivity = null;
        setLayoutId(R.layout.activity_custom_dialog);
        initViews(v);
           }

    @Override
    public void initViews(View v) {
        super.initViews(v);
        this.simpleMsg = (TextView) v.findViewById(R.id.simpleMsg);
        this.termsConditionWeb= (WebView) v.findViewById(R.id.termsConditionWeb);
        this.okBtn = (Button) v.findViewById(R.id.okBtn);
        fontClanProBold = Typeface.createFromAsset(context.getAssets(), "fonts/ufonts.com_clanpro-bold.ttf");
        Log.e("isNormal", isNormalDialog.toString());
        if(isNormalDialog){
            this.simpleMsg.setVisibility(View.VISIBLE);
            this.simpleMsg.setText(message);
            this.simpleMsg.setTypeface(fontClanProBold);
        } else {
            this.termsConditionWeb.setVisibility(View.VISIBLE);
            this.termsConditionWeb.loadData(message, "text/html", "UTF-8");
        }
        setCancelable(false);
        initEvent(v);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = activity;
    }

    private void initEvent(View v){
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(okClickListerner != null){
                    okClickListerner.clicked();
                }
                dismiss();
            }
        });
    }

    public static void ShowDialog(FragmentManager fm, String message, btnOkClick okClickListerner, Boolean isNormalDialog){
        CustomDialog dialog = new CustomDialog(message, okClickListerner, isNormalDialog);
        dialog.show(fm, "");
    }
}

MainActivity.java

inside a onClickListener

CustomDialog.ShowDialog(getSupportFragmentManager(), getResources().getString(R.string.message_register), new CustomDialog.btnOkClick() {
                    @Override
                    public void clicked() {
                        finish();
                    }
                }, isNormalDialog);
Vadim Kotov
  • 7,103
  • 8
  • 44
  • 57
Jeffrey Rajan
  • 3,041
  • 2
  • 24
  • 35

1 Answers1

0

It is bad practice to set values inside your Dialog constructor. Instead pass your values as arguments and initialize them on onCreate callback. Furthermore, you shall avoid saving instances of your activity on your fragment, it may lead to memory leaks. Instead I recomend you to create an interface on your CustomDialog or in your BaseDialogFragment that all activitys that uses them must implement. Then you need to implemnt onClickListener interface on your Dialog and inside it you can call mListener.onButtonClickListener(). See the example DialogFragment.

Your CustomDialog would look something like:

public class CustomDialog extends BaseDialogFragment {

private myFragmentInterface mListener;

public static CustomDialog newInstance(String message, Boolean isNormalDialog){
    Bundle args = new Bundle();
    args.putString(MESSAGE_ARG_KEY, message);
    args.putBoolean(TYPE_ARG_KEY, isNormalDialog);
    CustomDialog instance = new CustomDialog();
    instance.setArguments(args);
}

@override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    message = getArguments().getStirng(MESSAGE_ARG_KEY);
    isNormalDialog = getArguments().getBoolean(TYPE_ARG_KEY);
}

@override
public void onAttach(Activity activity){
    super.onAttach();
    try{
        mListener = (myFragmentInterface) activity;
    }catch(ClassCastException e){
        throw new ClassCastException("activiy must implement myFragmentInterface");
    }
}

public void onDetach(){
    super.onDetach();
    mListener = null;
}

public interface myFragmentInterface{
    onButtonClickListener(String... params);
}
}
ingkevin
  • 309
  • 4
  • 18