0

I got this error while I am going to show a dialog box

Error:-

No activity error

This error coming when I update below androidx's Libraries

1. implementation 'androidx.appcompat:appcompat:1.1.0-rc01

2. implementation 'com.google.android.material:material:1.1.0-alpha09'

----- This is my Confirm Dialog ----

public class ConfirmDialog extends BaseDialogFragment {

public static ConfirmDialog newInstance() {
    return new ConfirmDialog();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);      // Error Comes 

}

@Override
protected Dialog createDialog(Context activityContext) {

    AlertDialog.Builder builder;
        builder = new AlertDialog.Builder(activityContext, android.R.style.Theme_Material_Light_Dialog_Alert);

    AlertDialog alertDialog = builder.create();
    alertDialog.setCanceledOnTouchOutside(false);
    return alertDialog;
}

@Override
public void onClick(DialogInterface dialog, int which) {
    super.onDialogClick(dialog, which, which);
}
}

----- This is my BaseDialog ----

public abstract class BaseDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {

protected OnDialogClickListener onClickListener;

protected BaseDialogFragment() {
}

protected BaseDialogFragment(OnDialogClickListener onClickListener) {
    this.onClickListener = onClickListener;
}

public static void show(BaseDialogFragment dialogFragment, Context context) {
    dialogFragment.onCreate(null);
    Dialog dialog = dialogFragment.createDialog(context);
    dialog.show();
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return createDialog(getActivity());
}

protected abstract Dialog createDialog(Context activityContext);

public void setOnClickListener(OnDialogClickListener onClickListener) {
    this.onClickListener = onClickListener;
}

public void removeOnClickListener() {
    this.onClickListener = null;
}

public void onDialogClick(DialogInterface dialog, int which, Object o) {
    if (this.onClickListener != null) {
        this.onClickListener.onDialogClick(dialog, which, o);
    }
}
}

--- And Last, This is when I call my Confirmdialog ---

ConfirmDialog confirmDialog = ConfirmDialog.newInstance();
        confirmDialog.setOnClickListener(new OnDialogClickListener() {
        @Override
        public void onDialogClick(DialogInterface dialog, int which, Object o) {

            }
        });

 ConfirmDialog.show(confirmDialog, activity); // When I call this
VIISHRUT MAVANII
  • 11,410
  • 7
  • 34
  • 49
Bhaven Shah
  • 692
  • 1
  • 5
  • 18
  • Possible duplicate of [Fatal Exception: java.lang.IllegalStateException No activity](https://stackoverflow.com/questions/46157134/fatal-exception-java-lang-illegalstateexception-no-activity) – Lokesh Aug 12 '19 at 06:11
  • duplicate of https://stackoverflow.com/questions/46157134/fatal-exception-java-lang-illegalstateexception-no-activity – Lokesh Aug 12 '19 at 06:11
  • @Lokesh I don't think this is duplicate. Because of I can run this code very well unless I don't upgrade androidX libraries. – Bhaven Shah Aug 12 '19 at 06:31
  • why are you using "dialogFragment.onCreate(null);". this is lifecycle method and to do lot of thing in background which may require activity. – vaibhav kumar Aug 12 '19 at 06:36
  • check if you are using androidX then your fragment, fragmenmenger all thing you using must extend from androidX and also check which them you are using – Lokesh Aug 12 '19 at 06:42
  • @vaibhavkumar that parameter for savedInstanceState and I don't need it that's why I am giving null. – Bhaven Shah Aug 12 '19 at 06:47
  • @Bhavenshah i think you don't have need of that line, Because you are not doing any work or saveinstancestate. Remove and test. Possibly it will work for you – vaibhav kumar Aug 12 '19 at 07:08

4 Answers4

1

You can try: ConfirmDialog.show(confirmDialog, activity); instead ConfirmDialog.show(confirmDialog, this); Pass context or instance of the activity

KIRAN CSN
  • 121
  • 9
  • in this my case activity = classname.this .. I defined it to a global variable – Bhaven Shah Aug 12 '19 at 06:26
  • You can try this as second parameter / can pass application context – KIRAN CSN Aug 12 '19 at 06:28
  • From your activity your are passing as activity instance. but in BaseDialogFragment show show(BaseDialogFragment dialogFragment, Context context) method is context and again createDialog(getActivity()); you are passing activity.. You can also try like this show(BaseDialogFragment dialogFragment, Activity activity) change this line and try – KIRAN CSN Aug 12 '19 at 06:32
0

Dialog Fragment should handle click events inside, not in activity/fragment where you are initializing it.

And for comunication between dialog fragment and activity create interface implemented by activity.

For example

interface DialogFragmentResultListener {
    fun onDialogResultReceived(requestCode: Int, isPositive: Boolean)
}

and pass result from DialogFragment like this:

   if (activity is DialogFragmentResultListener) {
                        ......
   }
Antonis Radz
  • 3,036
  • 1
  • 16
  • 34
0

You Can Try like this method -

BaseDialogFragment -

 abstract class BaseDialogFragment : DialogFragment(), View.OnClickListener, BaseView {

override fun onClick(v: View?) {
}

abstract fun initObjects()

abstract fun registerListeners()

abstract fun initWidgets()

protected fun setFullScreen() {
    val width = ViewGroup.LayoutParams.MATCH_PARENT
    val height = ViewGroup.LayoutParams.MATCH_PARENT
    dialog?.window?.setLayout(width, height)
}

override fun onNetworkFailure(errorCode: Int, errorMessage: String?) {
    (activity!! as BaseActivity).onNetworkFailure(errorCode, errorMessage)
}

override fun onResponseFailure(error: CloudError?) {
    (activity!! as BaseActivity).onResponseFailure(error)

}

override fun showLoader(msg: String?) {
    (activity!! as BaseActivity).showLoader(msg)

}

override fun showLoader(msg: String?, isCancellable: Boolean?) {
    (activity!! as BaseActivity).showLoader(msg, isCancellable)

}

override fun dismissLoader() {
    (activity!! as BaseActivity).dismissLoader()
}

}

Create your confirm Dialog like this -

public class AddEmailDialogFragment extends BaseDialogFragment implements View.OnClickListener {
public static final String TAG = AddEmailDialogFragment.class.getSimpleName();
private Button btnSubmit;
private EditText etEmail;

private GetEmailCallback getEmailCallBack;

public static AddEmailDialogFragment newInstance() {
    return new AddEmailDialogFragment();
}

public void setListener(GetEmailCallback listener) {
    getEmailCallBack = listener;
}

@Nullable
@Override
public View onCreateView(@NotNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_askemail, container, false);

}

@Override
public void onViewCreated(@NotNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    initObjects();
    initWidgets();
    registerListeners();
}

@Override
public void initObjects() {

}

@Override
public void registerListeners() {
    btnSubmit.setOnClickListener(this);

}

@Override
public void initWidgets() {
    View view = getView();
    btnSubmit = view.findViewById(R.id.btn_submit);
    etEmail = view.findViewById(R.id.et_email);

}

@Override
public void onClick(View view) {
    if (view.getId() == R.id.btn_submit) {
        saveEmail();
    }
}

private boolean isValidEmail(String target) {
    return (!TextUtils.isEmpty(target) && Patterns.EMAIL_ADDRESS.matcher(target).matches());
}

private void saveEmail() {
    if (isValidEmail(etEmail.getText().toString()))
        getEmailCallBack.gotEMail(etEmail.getText().toString());
    else
        etEmail.setError(getString(R.string.err_invalidEmail));
}

}

And call the dialog fragment using this-

    val activity = activity
        if (null != activity) {
            addEmailDialogFragment = AddEmailDialogFragment.newInstance()
            addEmailDialogFragment!!.show(getActivity()!!.supportFragmentManager, AddEmailDialogFragment.TAG)
            addEmailDialogFragment!!.isCancelable = false
            addEmailDialogFragment!!.setListener(this)
        }
gStephin
  • 332
  • 3
  • 20
0

I got this issue after updating the version of androidx appcompat dependency. For Temporary I have resolved this issue by the below solution.

Use

implementation 'androidx.appcompat:appcompat:1.0.2'

instead of

implementation 'androidx.appcompat:appcompat:1.1.0'
VIISHRUT MAVANII
  • 11,410
  • 7
  • 34
  • 49