Dynamic Dialogs

A simple library to display dialogs and dialog fragments on Android 4.0 (API 14) and above devices.

dynamic-dialogs-preview

Since v2.0.0, it uses AndroidX so, first migrate your project to AndroidX.

Installation

It can be installed by adding the following dependency to your build.gradle file:

dependencies {
    // For AndroidX enabled projects.
    implementation 'com.pranavpandey.android:dynamic-dialogs:3.2.1'

    // For legacy projects.
    implementation 'com.pranavpandey.android:dynamic-dialogs:1.3.0'
}

Usage

dynamic-dialogs is a library to display dialog and dialog fragments with ease. It has some
improvements over appcompat-v7 (or AndroidX) dialogs and share the same behavior and methods
which can be used with any other framework or library.

For complete reference, please read the [documentation][documentation].

Setup

First add alertDialogStyle in the base application theme to make dynamic-dialogs working.

<!-- Base application theme. -->
<style name="AppTheme" parent="...">
    <!-- Customize your theme here. -->
    ...
    
    <!-- Add dynamic dialogs style in the base app theme. -->
    <item name="alertDialogStyle">@style/DynamicDialog</item>
</style>

DynamicDialog

It is almost identical to the AppCompatDialog but provides scroll indicators at top and bottom
for the custom dialogs also. So, if you are using any scrollable view in your custom dialog like
NestedScrollView or RecyclerView, it can be set as root view and the scroll indicators will be
added automatically if the view can be scrolled.

new DynamicDialog.Builder(context)
        // Set dialog title.
        .setTitle(...)
        ...
        // Set a custom view.
        .setView(int layoutResId)
        // OR
        setView(View view)
        // Set view root to automatically add scroll dividers.
        .setViewRoot(int viewRootId)
        // OR
        .setViewRoot(View viewRoot)
        // Show the dialog.
        .show();

DynamicDialogFragment

Base dialog fragment to provide all the functionality of DynamicDialog inside a fragment. It can
be extended to customise it further by overriding the supported methods.

public CustomDialogFragment extends DynamicDialogFragment {
    
    ...
    
    /**
     * Override this method to customise the dynamic dialog builder before creating the dialog.
     *
     * @param dialogBuilder The current builder to be customised.
     * @param savedInstanceState The saved state of the fragment to restore it later.
     *
     * @return The customised dynamic dialog builder.
     */
    @Override
    protected @NonNull DynamicDialog.Builder onCustomiseBuilder(
            @NonNull DynamicDialog.Builder dialogBuilder, @Nullable Bundle savedInstanceState) {
        // TODO: Customise the dialog here.
        ...
        
        return dialogBuilder;
    }
    
    /**
     * Override this method to customise the dynamic dialog before attaching it with 
     * this fragment.
     *
     * @param alertDialog The current dialog to be customised.
     * @param savedInstanceState The saved state of the fragment to restore it later.
     *
     * @return The customised dynamic dialog.
     */
    protected @NonNull DynamicDialog onCustomiseDialog(@NonNull DynamicDialog alertDialog,
            @Nullable Bundle savedInstanceState) {
        // TODO: Customise the dialog builder here.
        ...
        
        return alertDialog;
    }
    
    ...
}

Show dialog

Show the DynamicDialogFragment by using showDialog(fragmentActivity) method.

For better understanding, please check AboutDialogFragment in the sample project.

Dialog state

It will automatically maintain its state on configuration changes (like device rotation, etc.)
by calling setRetainInstance(true) in onCreate() method. If you don't want to use this feature
(generally, if you are displaying it in onResume() method) then, call setAutoDismiss(true) to
dismiss it in onPause() method.

DynamicDialogFragment.newInstance().
        ...
        // Dismiss dialog fragment on configuration changes.
        .setAutoDismiss(true)
        // Show the dialog fragment.
        .showDialog(fragmentActivity);

Dialog builder

To show quick DynamicDialogFragment, you can use its setBuilder(DynamicDialog.Builder) method
and pass DynamicDialog.Builder with all the customisations. It will automatically wrap it in a
DialogFragment and use showDialog(fragmentActivity) method to display it.

DynamicDialogFragment.newInstance().setBuilder(
        new DynamicDialog.Builder(context)
                // Set dialog title.
                .setTitle(...)
                // Set dialog message.
                .setMessage(...)
                // Set negative button with a click listener.
                .setNegativeButton(..., clickListener))
        // Show the dialog fragment.
        .showDialog(fragmentActivity);

Dialog callbacks

As DialogFragment has required some extra work to get the event callbacks, it already has all the
listeners of DynamicDialog.Builder built-in so that there is no extra effort is required.

DynamicDialogFragment.newInstance()
        ...
        // Callback when this dialog fragment is displayed.
        .setOnShowListener(onShowListener)
        // Callback when this dialog fragment has been dismissed.
        .setOnDismissListener(onDismissListener)
        // Callback when this dialog fragment has been canceled.
        .setOnCancelListener(onCancelListener)
        // Callback when a key is pressed in this dialog fragment.
        .setOnKeyListener(onKeyListener)
        // Show the dialog fragment.
        .showDialog(fragmentActivity);
        

For better understanding, please check CustomDialogFragment in the sample project.


Author

Pranav Pandey

GitHub