Use onCancel() and onDismiss() instead of calling setOnCancelListener() and setOnDismissListener() from onCreateDialog

Use onCancel() and onDismiss() instead of calling setOnCancelListener() and setOnDismissListener() from onCreateDialog()

This is a warning.

Id

DialogFragmentCallbacksDetector

Summary

Use onCancel() and onDismiss() instead of calling setOnCancelListener() and setOnDismissListener() from onCreateDialog()

Severity

Warning

Category

Correctness

Platform

Android

Vendor

Android Open Source Project

Identifier

androidx.fragment

Feedback

https://issuetracker.google.com/issues/new?component=460964

Min

Lint 7.0

Compiled

Lint 8.0 and 8.1

Artifact

androidx.fragment:fragment

Since

1.4.0

Affects

Kotlin and Java files

Editing

This check runs on the fly in the IDE editor

Implementation

Source Code

Tests

Source Code

Copyright Year

2021

When using a DialogFragment, the setOnCancelListener and setOnDismissListener callback functions within the onCreateDialog function must not be used because the DialogFragment owns these callbacks. Instead the respective onCancel and onDismiss functions can be used to achieve the desired effect.

Example

Here is an example of lint warnings produced by this check:

src/foo/TestFragment.java:11:Warning: Use onCancel() instead of calling
setOnCancelListener() from onCreateDialog()
[DialogFragmentCallbacksDetector]
    dialog.setOnCancelListener({ });
    -------------------------------

Here is the source file referenced above:

src/foo/TestFragment.java:

package foo; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; public class TestFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = AlertDialog.Builder(requireActivity()); dialog.setOnCancelListener({ }); return dialog.create(); } }

You can also visit the source code for the unit tests for this check to see additional scenarios.

The above example was automatically extracted from the first unit test found for this lint check, OnCreateDialogIncorrectCallbackDetector.java expect fail dialog fragment with cancel listener. To report a problem with this extracted sample, visit https://issuetracker.google.com/issues/new?component=460964.

Including

This is not a built-in check. To include it, add the below dependency to your project.

// build.gradle.kts
implementation("androidx.fragment:fragment:1.8.5")

// build.gradle
implementation 'androidx.fragment:fragment:1.8.5'

// build.gradle.kts with version catalogs:
implementation(libs.fragment)

# libs.versions.toml
[versions]
fragment = "1.8.5"
[libraries]
# For clarity and text wrapping purposes the following declaration is
# shown split up across lines, but in TOML it needs to be on a single
# line (see https://github.com/toml-lang/toml/issues/516) so adjust
# when pasting into libs.versions.toml:
fragment = {
    module = "androidx.fragment:fragment",
    version.ref = "fragment"
}

1.8.5 is the version this documentation was generated from; there may be newer versions available.

Additional details about androidx.fragment:fragment.

Suppressing

You can suppress false positives using one of the following mechanisms:

formatted by Markdeep 1.18