|
@@ -0,0 +1,1339 @@
|
|
|
+# Material Dialogs (Pre version 2.0, deprecated)
|
|
|
+
|
|
|
+[  ](https://bintray.com/drummer-aidan/maven/material-dialogs%3Acore/_latestVersion)
|
|
|
+[  ](https://bintray.com/drummer-aidan/maven/material-dialogs%3Acommons/_latestVersion)
|
|
|
+[](https://travis-ci.org/afollestad/material-dialogs)
|
|
|
+[](https://www.codacy.com/app/drummeraidan_50/material-dialogs?utm_source=github.com&utm_medium=referral&utm_content=afollestad/material-dialogs&utm_campaign=Badge_Grade)
|
|
|
+[](https://github.com/afollestad/material-dialogs/blob/master/LICENSE.txt)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# Table of Contents (Core)
|
|
|
+
|
|
|
+1. [Sample Project](https://github.com/afollestad/material-dialogs#sample-project)
|
|
|
+2. [Gradle Dependency](https://github.com/afollestad/material-dialogs#gradle-dependency)
|
|
|
+ 1. [Repository](https://github.com/afollestad/material-dialogs#repository)
|
|
|
+ 2. [Core](https://github.com/afollestad/material-dialogs#core)
|
|
|
+ 3. [Commons](https://github.com/afollestad/material-dialogs#commons)
|
|
|
+3. [What's New](https://github.com/afollestad/material-dialogs#whats-new)
|
|
|
+4. [Basic Dialog](https://github.com/afollestad/material-dialogs#basic-dialog)
|
|
|
+5. [Dismissing Dialogs](https://github.com/afollestad/material-dialogs#dismissing-dialogs)
|
|
|
+6. [Displaying an Icon](https://github.com/afollestad/material-dialogs#displaying-an-icon)
|
|
|
+7. [Stacked Action Buttons](https://github.com/afollestad/material-dialogs#stacked-action-buttons)
|
|
|
+ 1. [Stacking Behavior](https://github.com/afollestad/material-dialogs#stacking-behavior)
|
|
|
+8. [Neutral Action Button](https://github.com/afollestad/material-dialogs#neutral-action-button)
|
|
|
+9. [Callbacks](https://github.com/afollestad/material-dialogs#callbacks)
|
|
|
+10. [CheckBox Prompts](https://github.com/afollestad/material-dialogs#checkbox-prompts)
|
|
|
+11. [List Dialogs](https://github.com/afollestad/material-dialogs#list-dialogs)
|
|
|
+12. [Single Choice List Dialogs](https://github.com/afollestad/material-dialogs#single-choice-list-dialogs)
|
|
|
+ 1. [Coloring Radio Buttons](https://github.com/afollestad/material-dialogs#coloring-radio-buttons)
|
|
|
+13. [Multi Choice List Dialogs](https://github.com/afollestad/material-dialogs#multi-choice-list-dialogs)
|
|
|
+ 1. [Coloring Check Boxes](https://github.com/afollestad/material-dialogs#coloring-check-boxes)
|
|
|
+14. [Assigning IDs to List Item Views](https://github.com/afollestad/material-dialogs#assigning-ids-to-list-item-views)
|
|
|
+15. [Custom List Dialogs](https://github.com/afollestad/material-dialogs#custom-list-dialogs)
|
|
|
+16. [Custom Views](https://github.com/afollestad/material-dialogs#custom-views)
|
|
|
+ 1. [Later Access](https://github.com/afollestad/material-dialogs#later-access)
|
|
|
+17. [Typefaces](https://github.com/afollestad/material-dialogs#typefaces)
|
|
|
+18. [Getting and Setting Action Buttons](https://github.com/afollestad/material-dialogs#getting-and-setting-action-buttons)
|
|
|
+19. [Theming](https://github.com/afollestad/material-dialogs#theming)
|
|
|
+ 1. [Basics](https://github.com/afollestad/material-dialogs#basics)
|
|
|
+ 2. [Colors](https://github.com/afollestad/material-dialogs#colors)
|
|
|
+ 3. [Selectors](https://github.com/afollestad/material-dialogs#selectors)
|
|
|
+ 4. [Gravity](https://github.com/afollestad/material-dialogs#gravity)
|
|
|
+ 5. [Material Palette](https://github.com/afollestad/material-dialogs#material-palette)
|
|
|
+20. [Global Theming](https://github.com/afollestad/material-dialogs#global-theming)
|
|
|
+21. [Show, Cancel, and Dismiss Callbacks](https://github.com/afollestad/material-dialogs#show-cancel-and-dismiss-callbacks)
|
|
|
+22. [Input Dialogs](https://github.com/afollestad/material-dialogs#input-dialogs)
|
|
|
+ 1. [Coloring the EditText](https://github.com/afollestad/material-dialogs#coloring-the-edittext)
|
|
|
+ 2. [Limiting Input Length](https://github.com/afollestad/material-dialogs#limiting-input-length)
|
|
|
+ 3. [Custom Invalidation](https://github.com/afollestad/material-dialogs#custom-invalidation)
|
|
|
+23. [Progress Dialogs](https://github.com/afollestad/material-dialogs#progress-dialogs)
|
|
|
+ 1. [Proguard](https://github.com/afollestad/material-dialogs#proguard)
|
|
|
+ 2. [Indeterminate Progress Dialogs](https://github.com/afollestad/material-dialogs#indeterminate-progress-dialogs)
|
|
|
+ 3. [Determinate (Seek Bar) Progress Dialogs](https://github.com/afollestad/material-dialogs#determinate-seek-bar-progress-dialogs)
|
|
|
+ 4. [Make an Indeterminate Dialog Horizontal](https://github.com/afollestad/material-dialogs#make-an-indeterminate-dialog-horizontal)
|
|
|
+ 5. [Coloring the Progress Bar](https://github.com/afollestad/material-dialogs#coloring-the-progress-bar)
|
|
|
+ 6. [Custom Number and Progress Formats](https://github.com/afollestad/material-dialogs#custom-number-and-progress-formats)
|
|
|
+24. [Tint Helper](https://github.com/afollestad/material-dialogs#tint-helper)
|
|
|
+25. [Misc](https://github.com/afollestad/material-dialogs#misc)
|
|
|
+
|
|
|
+# Table of Contents (Commons)
|
|
|
+
|
|
|
+1. [Color Chooser Dialogs](https://github.com/afollestad/material-dialogs#color-chooser-dialogs)
|
|
|
+ 1. [Finding Visible Dialogs](https://github.com/afollestad/material-dialogs#finding-visible-dialogs)
|
|
|
+ 2. [User Color Input](https://github.com/afollestad/material-dialogs#user-color-input)
|
|
|
+2. [File Selector Dialogs](https://github.com/afollestad/material-dialogs#file-selector-dialogs)
|
|
|
+3. [Folder Selector Dialogs](https://github.com/afollestad/material-dialogs#folder-selector-dialogs)
|
|
|
+4. [Preference Dialogs](https://github.com/afollestad/material-dialogs#preference-dialogs)
|
|
|
+5. [Simple List Dialogs](https://github.com/afollestad/material-dialogs#simple-list-dialogs)
|
|
|
+
|
|
|
+------
|
|
|
+
|
|
|
+# Sample Project
|
|
|
+
|
|
|
+You can download the latest sample APK from this repo here: https://github.com/afollestad/material-dialogs/blob/master/sample/sample.apk
|
|
|
+
|
|
|
+It's also on Google Play:
|
|
|
+
|
|
|
+<a href="https://play.google.com/store/apps/details?id=com.afollestad.materialdialogssample" target="_blank">
|
|
|
+ <img alt="Get it on Google Play"
|
|
|
+ src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" height="60"/>
|
|
|
+</a>
|
|
|
+
|
|
|
+Having the sample project installed is a good way to be notified of new releases. Although Watching this
|
|
|
+repository will allow GitHub to email you whenever I publish a release.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Gradle Dependency
|
|
|
+
|
|
|
+### Repository
|
|
|
+
|
|
|
+The Gradle dependency is available via [jCenter](https://bintray.com/drummer-aidan/maven/material-dialogs:core/view).
|
|
|
+jCenter is the default Maven repository used by Android Studio.
|
|
|
+
|
|
|
+The minimum API level supported by this library is API 14.
|
|
|
+
|
|
|
+### Core
|
|
|
+
|
|
|
+The *core* module contains all the major classes of this library, including `MaterialDialog`.
|
|
|
+You can create basic, list, single/multi choice, progress, input, etc. dialogs with core.
|
|
|
+
|
|
|
+```gradle
|
|
|
+dependencies {
|
|
|
+ // ... other dependencies here
|
|
|
+ implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Commons
|
|
|
+
|
|
|
+The *commons* module contains extensions to the library that not everyone may need. This includes the
|
|
|
+`ColorChooserDialog`, `FolderChooserDialog`, the Material `Preference` classes, and `MaterialSimpleListAdapter`/`MaterialSimpleListItem`.
|
|
|
+
|
|
|
+```gradle
|
|
|
+dependencies {
|
|
|
+ // ... other dependencies here
|
|
|
+ implementation 'com.afollestad.material-dialogs:commons:0.9.6.0'
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+It's likely that new extensions will be added to commons later.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# What's New
|
|
|
+
|
|
|
+See the project's Releases page for a list of versions with their changelogs.
|
|
|
+
|
|
|
+### [View Releases](https://github.com/afollestad/material-dialogs/releases)
|
|
|
+
|
|
|
+If you Watch this repository, GitHub will send you an email every time I publish an update.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Basic Dialog
|
|
|
+
|
|
|
+First of all, note that `MaterialDialog` extends `DialogBase`, which extends `android.app.Dialog`.
|
|
|
+
|
|
|
+Here's a basic example that mimics the dialog you see on Google's Material design guidelines
|
|
|
+(here: http://www.google.com/design/spec/components/dialogs.html#dialogs-usage). Note that you can
|
|
|
+always substitute literal strings and string resources for methods that take strings, the same goes
|
|
|
+for color resources (e.g. `titleColor` and `titleColorRes`).
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.agree)
|
|
|
+ .negativeText(R.string.disagree)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+**Your Activities need to inherit the AppCompat themes in order to work correctly with this library.**
|
|
|
+The Material dialog will automatically match the `positiveColor` (which is used on the positive action
|
|
|
+button) to the `colorAccent` attribute of your styles.xml theme.
|
|
|
+
|
|
|
+If the content is long enough, it will become scrollable and a divider will be displayed above the action buttons.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Dismissing Dialogs
|
|
|
+
|
|
|
+I've had lots of issues asking how you dismiss a dialog. It works the same way that `AlertDialog` does, as
|
|
|
+both `AlertDialog` and `MaterialDialog` are an instance of `android.app.Dialog` (which is where `dismiss()`
|
|
|
+and `show()` come from). You cannot dismiss a dialog using it's `Builder`. You can only dismiss a
|
|
|
+dialog using the dialog itself.
|
|
|
+
|
|
|
+There's many ways you can get an instance of `MaterialDialog`. The two major ways are through the `show()` and `build()`
|
|
|
+methods of `MaterialDialog.Builder`.
|
|
|
+
|
|
|
+Through `show()`, which immediately shows the dialog and returns the visible dialog:
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.agree)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+Through `build()`, which only builds the dialog but doesn't show it until you say so:
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog.Builder builder = new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.agree);
|
|
|
+
|
|
|
+MaterialDialog dialog = builder.build();
|
|
|
+dialog.show();
|
|
|
+```
|
|
|
+
|
|
|
+Once the dialog is shown, you can dismiss it:
|
|
|
+
|
|
|
+```java
|
|
|
+dialog.dismiss();
|
|
|
+```
|
|
|
+
|
|
|
+There are other various places where the `MaterialDialog` instance is given, such as in some callbacks
|
|
|
+ that are discussed in future sections below.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Displaying an Icon
|
|
|
+
|
|
|
+MaterialDialog supports the display of an icon just like the stock AlertDialog; it will go to the left of the title.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.agree)
|
|
|
+ .icon(R.drawable.icon)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+You can limit the maximum size of the icon using the `limitIconToDefaultSize()`, `maxIconSize(int size)`,
|
|
|
+ or `maxIconSizeRes(int sizeRes)` Builder methods.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Stacked Action Buttons
|
|
|
+
|
|
|
+If you have multiple action buttons that together are too wide to fit on one line, the dialog will stack the
|
|
|
+buttons to be vertically oriented.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.longer_positive)
|
|
|
+ .negativeText(R.string.negative)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+### Stacking Behavior
|
|
|
+
|
|
|
+You can set stacking behavior from the `Builder`:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ ...
|
|
|
+ .stackingBehavior(StackingBehavior.ADAPTIVE) // the default value
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Neutral Action Button
|
|
|
+
|
|
|
+You can specify neutral text in addition to the positive and negative text. It will show the neutral
|
|
|
+action on the far left.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .content(R.string.content)
|
|
|
+ .positiveText(R.string.agree)
|
|
|
+ .negativeText(R.string.disagree)
|
|
|
+ .neutralText(R.string.more_info)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Callbacks
|
|
|
+
|
|
|
+**As of version 0.8.2.0, the `callback()` Builder method is deprecated in favor of the individual callback methods
|
|
|
+ discussed below. Earlier versions will still require use of `ButtonCallback`.**
|
|
|
+
|
|
|
+To know when the user selects an action button, you set callbacks:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .onPositive(new MaterialDialog.SingleButtonCallback() {
|
|
|
+ @Override
|
|
|
+ public void onClick(MaterialDialog dialog, DialogAction which) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .onNeutral(new MaterialDialog.SingleButtonCallback() {
|
|
|
+ @Override
|
|
|
+ public void onClick(MaterialDialog dialog, DialogAction which) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .onNegative(new MaterialDialog.SingleButtonCallback() {
|
|
|
+ @Override
|
|
|
+ public void onClick(MaterialDialog dialog, DialogAction which) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .onAny(new MaterialDialog.SingleButtonCallback() {
|
|
|
+ @Override
|
|
|
+ public void onClick(MaterialDialog dialog, DialogAction which) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+ });
|
|
|
+```
|
|
|
+
|
|
|
+If you are listening for all three action buttons, you could just use `onAny()`. The `which` (`DialogAction`)
|
|
|
+ parameter will tell you which button was pressed.
|
|
|
+
|
|
|
+If `autoDismiss` is turned off, then you must manually dismiss the dialog in these callbacks. Auto dismiss is on by default.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# CheckBox Prompts
|
|
|
+
|
|
|
+Checkbox prompts allow you to display a UI similar to what Android uses to ask for a permission on API 23+.
|
|
|
+
|
|
|
+**Note:** you can use checkbox prompts with list dialogs and input dialogs, too.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .iconRes(R.drawable.ic_launcher)
|
|
|
+ .limitIconToDefaultSize()
|
|
|
+ .title(R.string.example_title)
|
|
|
+ .positiveText(R.string.allow)
|
|
|
+ .negativeText(R.string.deny)
|
|
|
+ .onAny(new MaterialDialog.SingleButtonCallback() {
|
|
|
+ @Override
|
|
|
+ public void onClick(MaterialDialog dialog, DialogAction which) {
|
|
|
+ showToast("Prompt checked? " + dialog.isPromptCheckBoxChecked());
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .checkBoxPromptRes(R.string.dont_ask_again, false, null)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# List Dialogs
|
|
|
+
|
|
|
+Creating a list dialog only requires passing in an array of strings. The callback (`itemsCallback`) is
|
|
|
+also very simple.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .items(R.array.items)
|
|
|
+ .itemsCallback(new MaterialDialog.ListCallback() {
|
|
|
+ @Override
|
|
|
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+If `autoDismiss` is turned off, then you must manually dismiss the dialog in the callback. Auto dismiss is on by default.
|
|
|
+You can pass `positiveText()` or the other action buttons to the builder to force it to display the action buttons
|
|
|
+below your list, however this is only useful in some specific cases.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Single Choice List Dialogs
|
|
|
+
|
|
|
+Single choice list dialogs are almost identical to regular list dialogs. The only difference is that
|
|
|
+you use `itemsCallbackSingleChoice` to set a callback rather than `itemsCallback`. That signals the dialog to
|
|
|
+display radio buttons next to list items.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .items(R.array.items)
|
|
|
+ .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
|
|
|
+ @Override
|
|
|
+ public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
|
|
|
+ /**
|
|
|
+ * If you use alwaysCallSingleChoiceCallback(), which is discussed below,
|
|
|
+ * returning false here won't allow the newly selected radio button to actually be selected.
|
|
|
+ **/
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .positiveText(R.string.choose)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+If you want to preselect an item, pass an index 0 or greater in place of -1 in `itemsCallbackSingleChoice()`.
|
|
|
+Later, you can update the selected index using `setSelectedIndex(int)` on the `MaterialDialog` instance,
|
|
|
+if you're not using a custom adapter.
|
|
|
+
|
|
|
+If you do not set a positive action button using `positiveText()`, the dialog will automatically call
|
|
|
+the single choice callback when user presses the positive action button. The dialog will also dismiss itself,
|
|
|
+unless auto dismiss is turned off.
|
|
|
+
|
|
|
+If you make a call to `alwaysCallSingleChoiceCallback()`, the single choice callback will be called
|
|
|
+every time the user selects/unselects an item.
|
|
|
+
|
|
|
+## Coloring Radio Buttons
|
|
|
+
|
|
|
+Like action buttons and many other elements of the Material dialog, you can customize the color of a
|
|
|
+ dialog's radio buttons. The `Builder` class contains a `widgetColor()`, `widgetColorRes()`,
|
|
|
+ `widgetColorAttr()`, and `choiceWidgetColor()` method. Their names and parameter annotations make them self explanatory.
|
|
|
+
|
|
|
+`widgetColor` is the same color that affects other UI elements. `choiceWidgetColor` is specific to
|
|
|
+single and multiple choice dialogs, it only affects radio buttons and checkboxes. You provide a
|
|
|
+`ColorStateList` rather than a single color which is used to generate a `ColorStateList`.
|
|
|
+
|
|
|
+ Note that by default, radio buttons will be colored with the color held in `colorAccent` (for AppCompat)
|
|
|
+ or `android:colorAccent` (for the Material theme) in your Activity's theme.
|
|
|
+
|
|
|
+There's also a global theming attribute as shown in the Global Theming section of this README: `md_widget_color`.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Multi Choice List Dialogs
|
|
|
+
|
|
|
+Multiple choice list dialogs are almost identical to regular list dialogs. The only difference is that
|
|
|
+you use `itemsCallbackMultiChoice` to set a callback rather than `itemsCallback`. That signals the dialog to
|
|
|
+display check boxes next to list items, and the callback can return multiple selections.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .items(R.array.items)
|
|
|
+ .itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {
|
|
|
+ @Override
|
|
|
+ public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
|
|
|
+ /**
|
|
|
+ * If you use alwaysCallMultiChoiceCallback(), which is discussed below,
|
|
|
+ * returning false here won't allow the newly selected check box to actually be selected
|
|
|
+ * (or the newly unselected check box to be unchecked).
|
|
|
+ * See the limited multi choice dialog example in the sample project for details.
|
|
|
+ **/
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .positiveText(R.string.choose)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+If you want to preselect any items, pass an array of indices (resource or literal) in place of null
|
|
|
+in `itemsCallbackMultiChoice()`. Later, you can update the selected indices using `setSelectedIndices(Integer[])`
|
|
|
+on the `MaterialDialog` instance, if you're not using a custom adapter.
|
|
|
+
|
|
|
+If you do not set a positive action button using `positiveText()`, the dialog will automatically call
|
|
|
+the multi choice callback when user presses the positive action button. The dialog will also dismiss itself,
|
|
|
+unless auto dismiss is turned off.
|
|
|
+
|
|
|
+If you make a call to `alwaysCallMultiChoiceCallback()`, the multi choice callback will be called
|
|
|
+every time the user selects/unselects an item.
|
|
|
+
|
|
|
+## Coloring Check Boxes
|
|
|
+
|
|
|
+Like action buttons and many other elements of the Material dialog, you can customize the color of a
|
|
|
+ dialog's check boxes. The `Builder` class contains a `widgetColor()`, `widgetColorRes()`,
|
|
|
+ `widgetColorAttr()`, and `choiceWidgetColor()` method. Their names and parameter annotations make them self explanatory.
|
|
|
+
|
|
|
+`widgetColor` is the same color that affects other UI elements. `choiceWidgetColor` is specific to
|
|
|
+single and multiple choice dialogs, it only affects radio buttons and checkboxes. You provide a
|
|
|
+`ColorStateList` rather than a single color which is used to generate a `ColorStateList`.
|
|
|
+
|
|
|
+ Note that by default, radio buttons will be colored with the color held in `colorAccent` (for AppCompat)
|
|
|
+ or `android:colorAccent` (for the Material theme) in your Activity's theme.
|
|
|
+
|
|
|
+There's also a global theming attribute as shown in the Global Theming section of this README: `md_widget_color`.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Assigning IDs to List Item Views
|
|
|
+
|
|
|
+If you need to keep track of list items by ID rather than index, you can assign item IDs from an integer array:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.socialNetworks)
|
|
|
+ .items(R.array.socialNetworks)
|
|
|
+ .itemsIds(R.array.itemIds)
|
|
|
+ .itemsCallback(new MaterialDialog.ListCallback() {
|
|
|
+ @Override
|
|
|
+ public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
|
|
|
+ Toast.makeText(Activity.this, which + ": " + text + ", ID = " + view.getId(), Toast.LENGTH_SHORT).show();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+You can also pass a literal integer array (`int[]`) in place of an array resource ID.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Custom List Dialogs
|
|
|
+
|
|
|
+Like Android's native dialogs, you can also pass in your own adapter via `.adapter()` to customize
|
|
|
+exactly how you want your list to work.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.socialNetworks)
|
|
|
+ // second parameter is an optional layout manager. Must be a LinearLayoutManager or GridLayoutManager.
|
|
|
+ .adapter(new ButtonItemAdapter(this, R.array.socialNetworks), null)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+**Note** that with newer releases, Material Dialogs no longer supports `ListView` and `ListAdapter`.
|
|
|
+It's about time that everyone uses `RecyclerView`. **Your custom adapters will have to handle item click
|
|
|
+events on their own; this library's classes and sample project have some good examples of how that is done correctly.**
|
|
|
+
|
|
|
+If you need access to the `RecyclerView`, you can use the `MaterialDialog` instance:
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = new MaterialDialog.Builder(this)
|
|
|
+ ...
|
|
|
+ .build();
|
|
|
+
|
|
|
+RecyclerView list = dialog.getRecyclerView();
|
|
|
+// Do something with it
|
|
|
+
|
|
|
+dialog.show();
|
|
|
+```
|
|
|
+
|
|
|
+Note that you don't need to be using a custom adapter in order to access the `RecyclerView`, it's there for single/multi choice dialogs, regular list dialogs, etc.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Custom Views
|
|
|
+
|
|
|
+Custom views are very easy to implement.
|
|
|
+
|
|
|
+```java
|
|
|
+boolean wrapInScrollView = true;
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.title)
|
|
|
+ .customView(R.layout.custom_view, wrapInScrollView)
|
|
|
+ .positiveText(R.string.positive)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+If `wrapInScrollView` is true, then the library will place your custom view inside of a ScrollView for you.
|
|
|
+This allows users to scroll your custom view if necessary (small screens, long content, etc.). However, there are cases
|
|
|
+when you don't want that behavior. This mostly consists of cases when you'd have a ScrollView in your custom layout,
|
|
|
+including ListViews, RecyclerViews, WebViews, GridViews, etc. The sample project contains examples of using both true
|
|
|
+ and false for this parameter.
|
|
|
+
|
|
|
+Your custom view will automatically have padding put around it when `wrapInScrollView` is true. Otherwise
|
|
|
+you're responsible for using padding values that look good with your content.
|
|
|
+
|
|
|
+## Later Access
|
|
|
+
|
|
|
+If you need to access a View in the custom view after the dialog is built, you can use `getCustomView()` of
|
|
|
+`MaterialDialog`. This is especially useful if you pass a layout resource to the `Builder`, the dialog will
|
|
|
+handle the view inflation for you.
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = //... initialization via the builder ...
|
|
|
+View view = dialog.getCustomView();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Typefaces
|
|
|
+
|
|
|
+If you want to use custom fonts, you can make a call to `typeface(String, String)` when
|
|
|
+using the `Builder`. This will pull fonts from files in your project's `assets/fonts` folder. For example,
|
|
|
+if you had `Roboto.ttf` and `Roboto-Light.ttf` in `/src/main/assets/fonts`, you would call `typeface("Roboto.ttf", "Roboto-Light.ttf")`.
|
|
|
+This method will also handle recycling Typefaces via the `TypefaceHelper` which you can use in your own project to avoid duplicate
|
|
|
+allocations. The raw `typeface(Typeface, Typeface)` variation will not recycle typefaces, every call will allocate the Typeface again.
|
|
|
+
|
|
|
+There's a global theming attribute available to automatically apply fonts to every Material Dialog in
|
|
|
+your app, also.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Getting and Setting Action Buttons
|
|
|
+
|
|
|
+If you want to get a reference to one of the dialog action buttons after the dialog is built and shown (e.g. to enable or disable buttons):
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = //... initialization via the builder ...
|
|
|
+View negative = dialog.getActionButton(DialogAction.NEGATIVE);
|
|
|
+View neutral = dialog.getActionButton(DialogAction.NEUTRAL);
|
|
|
+View positive = dialog.getActionButton(DialogAction.POSITIVE);
|
|
|
+```
|
|
|
+
|
|
|
+If you want to update the title of a dialog action button (you can pass a string resource ID in place of the literal string, too):
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = //... initialization via the builder ...
|
|
|
+dialog.setActionButton(DialogAction.NEGATIVE, "New Title");
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Theming
|
|
|
+
|
|
|
+Before Lollipop, theming AlertDialogs was basically impossible without using reflection and custom drawables.
|
|
|
+Since KitKat, Android became more color neutral but AlertDialogs continued to use Holo Blue for the title and
|
|
|
+title divider. Lollipop has improved even more, with no colors in the dialog by default other than the action
|
|
|
+buttons. This library makes theming even easier.
|
|
|
+
|
|
|
+## Basics
|
|
|
+
|
|
|
+By default, Material Dialogs will apply a light theme or dark theme based on the `?android:textColorPrimary`
|
|
|
+attribute retrieved from the context creating the dialog. If the color is light (e.g. more white), it will
|
|
|
+guess the Activity is using a dark theme and it will use the dialog's dark theme. Vice versa for the light theme.
|
|
|
+You can manually set the theme used from the `Builder#theme()` method:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .content("Hi")
|
|
|
+ .theme(Theme.DARK)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+Or you can use the global theming attribute, which is discussed in the section below. Global theming
|
|
|
+avoids having to constantly call theme setters for every dialog you show.
|
|
|
+
|
|
|
+## Colors
|
|
|
+
|
|
|
+Pretty much every aspect of a dialog created with this library can be colored:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .titleColorRes(R.color.material_red_500)
|
|
|
+ .contentColor(Color.WHITE) // notice no 'res' postfix for literal color
|
|
|
+ .linkColorAttr(R.attr.my_link_color_attr) // notice attr is used instead of none or res for attribute resolving
|
|
|
+ .dividerColorRes(R.color.material_pink_500)
|
|
|
+ .backgroundColorRes(R.color.material_blue_grey_800)
|
|
|
+ .positiveColorRes(R.color.material_red_500)
|
|
|
+ .neutralColorRes(R.color.material_red_500)
|
|
|
+ .negativeColorRes(R.color.material_red_500)
|
|
|
+ .widgetColorRes(R.color.material_red_500)
|
|
|
+ .buttonRippleColorRes(R.color.material_red_500)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+The names are self explanatory for the most part. The `widgetColor` method, discussed in a few other
|
|
|
+sections of this tutorial, applies to progress bars, check boxes, and radio buttons. Also note that
|
|
|
+each of these methods have 3 variations for setting a color directly, using color resources, and using
|
|
|
+color attributes.
|
|
|
+
|
|
|
+## Selectors
|
|
|
+
|
|
|
+Selectors are drawables that change state when pressed or focused.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .btnSelector(R.drawable.custom_btn_selector)
|
|
|
+ .btnSelector(R.drawable.custom_btn_selector_primary, DialogAction.POSITIVE)
|
|
|
+ .btnSelectorStacked(R.drawable.custom_btn_selector_stacked)
|
|
|
+ .listSelector(R.drawable.custom_list_and_stackedbtn_selector)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+The first `btnSelector` line sets a selector drawable used for all action buttons. The second `btnSelector`
|
|
|
+line overwrites the drawable used only for the positive button. This results in the positive button having
|
|
|
+a different selector than the neutral and negative buttons. `btnSelectorStacked` sets a selector drawable
|
|
|
+used when the buttons become stacked, either because there's not enough room to fit them all on one line,
|
|
|
+or because you used `forceStacked(true)` on the `Builder`. `listSelector` is used for list items, when
|
|
|
+you are NOT using a custom adapter.
|
|
|
+
|
|
|
+***Note***:
|
|
|
+
|
|
|
+***An important note related to using custom action button selectors***: make sure your selector drawable references
|
|
|
+inset drawables like the default ones do - this is important for correct action button padding.
|
|
|
+
|
|
|
+## Gravity
|
|
|
+
|
|
|
+It's probably unlikely you'd want to change gravity of elements in a dialog, but it's possible.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .titleGravity(GravityEnum.CENTER)
|
|
|
+ .contentGravity(GravityEnum.CENTER)
|
|
|
+ .btnStackedGravity(GravityEnum.START)
|
|
|
+ .itemsGravity(GravityEnum.END)
|
|
|
+ .buttonsGravity(GravityEnum.END)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+These are pretty self explanatory. `titleGravity` sets the gravity for the dialog title, `contentGravity`
|
|
|
+sets the gravity for the dialog content, `btnStackedGravity` sets the gravity for stacked action buttons,
|
|
|
+`itemsGravity` sets the gravity for list items (when you're NOT using a custom adapter).
|
|
|
+
|
|
|
+For, `buttonsGravity` refer to this:
|
|
|
+
|
|
|
+<table>
|
|
|
+<tr>
|
|
|
+<td><b>START (Default)</b></td>
|
|
|
+<td>Neutral</td>
|
|
|
+<td>Negative</td>
|
|
|
+<td>Positive</td>
|
|
|
+</tr>
|
|
|
+<tr>
|
|
|
+<td><b>CENTER</b></td>
|
|
|
+<td>Negative</td>
|
|
|
+<td>Neutral</td>
|
|
|
+<td>Positive</td>
|
|
|
+</tr>
|
|
|
+<tr>
|
|
|
+<td><b>END</b></td>
|
|
|
+<td>Positive</td>
|
|
|
+<td>Negative</td>
|
|
|
+<td>Neutral</td>
|
|
|
+</tr>
|
|
|
+</table>
|
|
|
+
|
|
|
+With no positive button, the negative button takes it's place except for with CENTER.
|
|
|
+
|
|
|
+## Material Palette
|
|
|
+
|
|
|
+To see colors that fit the Material design palette, see this page: http://www.google.com/design/spec/style/color.html#color-color-palette
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Global Theming
|
|
|
+
|
|
|
+Most of the theming aspects discussed in the above section can be automatically applied to all dialogs
|
|
|
+you show from an Activity which has a theme containing any of these attributes:
|
|
|
+
|
|
|
+```xml
|
|
|
+<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
|
|
+
|
|
|
+ <!--
|
|
|
+ All dialogs will default to Theme.DARK with this set to true.
|
|
|
+ -->
|
|
|
+ <item name="md_dark_theme">true</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the default dark or light dialog background color.
|
|
|
+ Note that if you use a dark color here, you should set md_dark_theme to
|
|
|
+ true so text and selectors look visible
|
|
|
+ -->
|
|
|
+ <item name="md_background_color">#37474F</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ Applies an icon next to the title in all dialogs.
|
|
|
+ -->
|
|
|
+ <item name="md_icon">@drawable/ic_launcher</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ Limit icon to a max size.
|
|
|
+ -->
|
|
|
+ <attr name="md_icon_max_size" format="dimension" />
|
|
|
+
|
|
|
+ <!--
|
|
|
+ Limit the icon to a default max size (48dp).
|
|
|
+ -->
|
|
|
+ <attr name="md_icon_limit_icon_to_default_size" format="boolean" />
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the title text color is derived from the
|
|
|
+ ?android:textColorPrimary system attribute.
|
|
|
+ -->
|
|
|
+ <item name="md_title_color">#E91E63</item>
|
|
|
+
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the content text color is derived from the
|
|
|
+ ?android:textColorSecondary system attribute.
|
|
|
+ -->
|
|
|
+ <item name="md_content_color">#9C27B0</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the link color is derived from the colorAccent attribute
|
|
|
+ of AppCompat or android:colorAccent attribute of the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_link_color">#673AB7</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the positive action text color is derived
|
|
|
+ from the colorAccent attribute of AppCompat or android:colorAccent
|
|
|
+ attribute of the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_positive_color">#673AB7</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the neutral action text color is derived
|
|
|
+ from the colorAccent attribute of AppCompat or android:colorAccent
|
|
|
+ attribute of the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_neutral_color">#673AB7</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the negative action text color is derived
|
|
|
+ from the colorAccent attribute of AppCompat or android:colorAccent
|
|
|
+ attribute of the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_negative_color">#673AB7</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, a progress dialog's progress bar, check boxes, and radio buttons
|
|
|
+ have a color that is derived from the colorAccent attribute of AppCompat or
|
|
|
+ android:colorAccent attribute of the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_widget_color">#673AB7</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ By default, the list item text color is black for the light
|
|
|
+ theme and white for the dark theme.
|
|
|
+ -->
|
|
|
+ <item name="md_item_color">#9C27B0</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the color used for the top and bottom dividers used when
|
|
|
+ content is scrollable
|
|
|
+ -->
|
|
|
+ <item name="md_divider_color">#E91E63</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the color used for the ripple displayed on action buttons (Lollipop and above).
|
|
|
+ Defaults to the colorControlHighlight attribute from AppCompat OR the Material theme.
|
|
|
+ -->
|
|
|
+ <item name="md_btn_ripple_color">#E91E63</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the selector used on list items.
|
|
|
+ -->
|
|
|
+ <item name="md_list_selector">@drawable/selector</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the selector used on stacked action buttons.
|
|
|
+ -->
|
|
|
+ <item name="md_btn_stacked_selector">@drawable/selector</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the background selector used on the positive action button.
|
|
|
+ -->
|
|
|
+ <item name="md_btn_positive_selector">@drawable/selector</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the background selector used on the neutral action button.
|
|
|
+ -->
|
|
|
+ <item name="md_btn_neutral_selector">@drawable/selector</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This overrides the background selector used on the negative action button.
|
|
|
+ -->
|
|
|
+ <item name="md_btn_negative_selector">@drawable/selector</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This sets the gravity used while displaying the dialog title, defaults to start.
|
|
|
+ Can be start, center, or end.
|
|
|
+ -->
|
|
|
+ <item name="md_title_gravity">start</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This sets the gravity used while displaying the dialog content, defaults to start.
|
|
|
+ Can be start, center, or end.
|
|
|
+ -->
|
|
|
+ <item name="md_content_gravity">start</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This sets the gravity used while displaying the list items (not including custom adapters), defaults to start.
|
|
|
+ Can be start, center, or end.
|
|
|
+ -->
|
|
|
+ <item name="md_items_gravity">start</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This sets the gravity used while displaying the dialog action buttons, defaults to start.
|
|
|
+
|
|
|
+ START (Default) Neutral Negative Positive
|
|
|
+ CENTER: Negative Neutral Positive
|
|
|
+ END: Positive Negative Neutral
|
|
|
+ -->
|
|
|
+ <item name="md_buttons_gravity">start</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ This sets the gravity used while displaying the stacked action buttons, defaults to end.
|
|
|
+ Can be start, center, or end.
|
|
|
+ -->
|
|
|
+ <item name="md_btnstacked_gravity">end</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ The name of font in assets/fonts used on titles and action buttons
|
|
|
+ (null uses device default). E.g. [your-project]/app/main/assets/fonts/[medium]
|
|
|
+ -->
|
|
|
+ <item name="md_medium_font">Roboto-Medium.ttf</item>
|
|
|
+
|
|
|
+ <!--
|
|
|
+ The name of font in assets/fonts used everywhere else, like content and list items
|
|
|
+ (null uses device default). E.g. [your-project]/app/main/assets/fonts/[regular]
|
|
|
+ -->
|
|
|
+ <item name="md_regular_font">Roboto-Regular.ttf</item>
|
|
|
+
|
|
|
+</style>
|
|
|
+```
|
|
|
+
|
|
|
+The action button color is also derived from the `android:colorAccent` attribute of the Material theme,
|
|
|
+or `colorAccent` attribute of the AppCompat Material theme as seen in the sample project. Manually setting
|
|
|
+the color will override that behavior.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Show, Cancel, and Dismiss Callbacks
|
|
|
+
|
|
|
+You can directly setup show/cancel/dismiss listeners from the `Builder` rather than on the resulting
|
|
|
+`MaterialDialog` instance.
|
|
|
+
|
|
|
+Also note that the `Builder` has a `cancelable()` method that lets you disable dismissing the dialog
|
|
|
+when you tap outside the dialog window.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title("Use Google's Location Services?")
|
|
|
+ .content("Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.")
|
|
|
+ .positiveText("Agree")
|
|
|
+ .showListener(new DialogInterface.OnShowListener() {
|
|
|
+ @Override
|
|
|
+ public void onShow(DialogInterface dialog) {
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .cancelListener(new DialogInterface.OnCancelListener() {
|
|
|
+ @Override
|
|
|
+ public void onCancel(DialogInterface dialog) {
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .dismissListener(new DialogInterface.OnDismissListener() {
|
|
|
+ @Override
|
|
|
+ public void onDismiss(DialogInterface dialog) {
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Input Dialogs
|
|
|
+
|
|
|
+An input dialog is pretty self explanatory, it retrieves input from the user of your application with
|
|
|
+an input field (EditText). You can also display content above the EditText if you desire.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.input)
|
|
|
+ .content(R.string.input_content)
|
|
|
+ .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)
|
|
|
+ .input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {
|
|
|
+ @Override
|
|
|
+ public void onInput(MaterialDialog dialog, CharSequence input) {
|
|
|
+ // Do something
|
|
|
+ }
|
|
|
+ }).show();
|
|
|
+```
|
|
|
+
|
|
|
+The input dialog will automatically handle focusing the EditText and displaying the keyboard to allow
|
|
|
+the user to immediately enter input. When the dialog is closed, the keyboard will be automatically dismissed.
|
|
|
+
|
|
|
+**Note that the dialog will force the positive action button to be visible, when it's pressed the input
|
|
|
+is submitted to the callback.**
|
|
|
+
|
|
|
+**Also Note that the call to `inputType()` is optional.**
|
|
|
+
|
|
|
+## Coloring the EditText
|
|
|
+
|
|
|
+Like action buttons and many other elements of the Material dialog, you can customize the color of a
|
|
|
+ input dialog's `EditText`. The `Builder` class contains a `widgetColor()`, `widgetColorRes()`,
|
|
|
+ and `widgetColorAttr()` method. Their names and parameter annotations make them self explanatory.
|
|
|
+ Note that by default, EditTexts will be colored with the color held in `colorAccent` (for AppCompat)
|
|
|
+ or `android:colorAccent` (for the Material theme) in your Activity's theme.
|
|
|
+
|
|
|
+There's also a global theming attribute as shown in the Global Theming section of this README: `md_widget_color`.
|
|
|
+
|
|
|
+## Limiting Input Length
|
|
|
+
|
|
|
+The code below will show a little indicator in the input dialog that tells the user how many characters they've
|
|
|
+typed. If they type less than 2 characters, or more than 20, the dialog won't allow the input to be submitted.
|
|
|
+It will also color the input field and character counter in error color passed for the third parameter.
|
|
|
+
|
|
|
+If you pass 0 for the min length, there will be no min length. If you pass -1 for the max length, there will
|
|
|
+be no max length. If you don't pass a third parameter at all, it will default to Material red.
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.input)
|
|
|
+ .inputRangeRes(2, 20, R.color.material_red_500)
|
|
|
+ .input(null, null, new MaterialDialog.InputCallback() {
|
|
|
+ @Override
|
|
|
+ public void onInput(MaterialDialog dialog, CharSequence input) {
|
|
|
+ // Do something
|
|
|
+ }
|
|
|
+ }).show();
|
|
|
+```
|
|
|
+
|
|
|
+*Note that `inputRangeRes(int, int, int)` takes a color resource ID for the third parameter, while
|
|
|
+`inputRange(int, int, int)` takes a literal color integer for the second parameter. You can use either one, or use
|
|
|
+the variation that doesn't take a third parameter at all.
|
|
|
+
|
|
|
+## Custom Invalidation
|
|
|
+
|
|
|
+The easiest way to invalidate (enable or disable the EditText based on whether you think the input is acceptable)
|
|
|
+input dialogs is to call `alwaysCallInputCallback()` from the `Builder` so that the callback is invoked
|
|
|
+every time the user changes their input. From there, you can constantly check what they've typed. If you
|
|
|
+decide they shouldn't be able to submit that, you can disable the submit button using this from within the callback:
|
|
|
+
|
|
|
+```java
|
|
|
+dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Progress Dialogs
|
|
|
+
|
|
|
+This library allows you to display progress dialogs with Material design that even use your app's
|
|
|
+accent color to color the progress bars (if you use AppCompat to theme your app, or the Material theme on Lollipop).
|
|
|
+
|
|
|
+## Proguard
|
|
|
+
|
|
|
+Normally, `ObjectAnimator` in the context it's used in this library (for custom progress drawables) would
|
|
|
+need special proguard rules so that certain elements aren't removed when your app is built in release mode.
|
|
|
+Luckily, AAR packages are allowed to specify proguard rules that get included in apps that depend on them.
|
|
|
+So you do not need to worry about including any Proguard rules in order to ensure progress bars behave well.
|
|
|
+
|
|
|
+## Indeterminate Progress Dialogs
|
|
|
+
|
|
|
+This will display the classic progress dialog with a spinning circle, see the sample project to see it in action:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.progress_dialog)
|
|
|
+ .content(R.string.please_wait)
|
|
|
+ .progress(true, 0)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+## Determinate (Seek Bar) Progress Dialogs
|
|
|
+
|
|
|
+If a dialog is not indeterminate, it displays a horizontal progress bar that increases up until a max value.
|
|
|
+The comments in the code explain what this does.
|
|
|
+
|
|
|
+```java
|
|
|
+// Create and show a non-indeterminate dialog with a max value of 150
|
|
|
+// If the showMinMax parameter is true, a min/max ratio will be shown to the left of the seek bar.
|
|
|
+boolean showMinMax = true;
|
|
|
+MaterialDialog dialog = new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.progress_dialog)
|
|
|
+ .content(R.string.please_wait)
|
|
|
+ .progress(false, 150, showMinMax)
|
|
|
+ .show();
|
|
|
+
|
|
|
+// Loop until the dialog's progress value reaches the max (150)
|
|
|
+while (dialog.getCurrentProgress() != dialog.getMaxProgress()) {
|
|
|
+ // If the progress dialog is cancelled (the user closes it before it's done), break the loop
|
|
|
+ if (dialog.isCancelled()) break;
|
|
|
+ // Wait 50 milliseconds to simulate doing work that requires progress
|
|
|
+ try {
|
|
|
+ Thread.sleep(50);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // Increment the dialog's progress by 1 after sleeping for 50ms
|
|
|
+ dialog.incrementProgress(1);
|
|
|
+}
|
|
|
+
|
|
|
+// When the loop exits, set the dialog content to a string that equals "Done"
|
|
|
+dialog.setContent(getString(R.string.done));
|
|
|
+```
|
|
|
+
|
|
|
+See the sample project for this dialog in action, with the addition of threading.
|
|
|
+
|
|
|
+## Make an Indeterminate Dialog Horizontal
|
|
|
+
|
|
|
+By default, indeterminate progress dialogs use a circular progress indicator. From the `Builder`,
|
|
|
+you can tell the dialog that it needs to use a horizontal indicator when displaying an indeterminate progress
|
|
|
+dialog:
|
|
|
+
|
|
|
+```java
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.progress_dialog)
|
|
|
+ .content(R.string.please_wait)
|
|
|
+ .progress(true, 0)
|
|
|
+ .progressIndeterminateStyle(true)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+## Coloring the Progress Bar
|
|
|
+
|
|
|
+Like action buttons and many other elements of the Material dialog, you can customize the color of a
|
|
|
+ progress dialog's progress bar. The `Builder` class contains a `widgetColor()`, `widgetColorRes()`,
|
|
|
+ and `widgetColorAttr()` method. Their names and parameter annotations make them self explanatory.
|
|
|
+ Note that by default, progress bars will be colored with the color held in `colorAccent` (for AppCompat)
|
|
|
+ or `android:colorAccent` (for the Material theme) in your Activity's theme.
|
|
|
+
|
|
|
+There's also a global theming attribute as shown in the Global Theming section of this README: `md_widget_color`.
|
|
|
+
|
|
|
+## Custom Number and Progress Formats
|
|
|
+
|
|
|
+Like the stock `ProgressDialog`, you can format the progress min/max numbers and the percentage indicator
|
|
|
+of determinate dialogs.
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = new MaterialDialog.Builder(this)
|
|
|
+ .progress(false, 150, true)
|
|
|
+ ...
|
|
|
+ .progressNumberFormat("%1d/%2d")
|
|
|
+ .progressPercentFormat(NumberFormat.getPercentageInstance())
|
|
|
+ ...
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+The values passed above are the default.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Tint Helper
|
|
|
+
|
|
|
+You can use the `MDTintHelper` class to dynamically color check boxes, radio buttons, edit texts, and progress bars
|
|
|
+(to get around not being able to change `styles.xml` at runtime). It is used in the library to dynamically color
|
|
|
+UI elements to match your set `widgetColor`.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Misc
|
|
|
+
|
|
|
+If you don't want the dialog to automatically be dismissed when an action button is pressed or when
|
|
|
+the user selects a list item:
|
|
|
+
|
|
|
+```java
|
|
|
+MaterialDialog dialog = new MaterialDialog.Builder(this)
|
|
|
+ // ... other initialization
|
|
|
+ .autoDismiss(false)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Color Chooser Dialogs
|
|
|
+
|
|
|
+The Builder is used like this:
|
|
|
+
|
|
|
+```java
|
|
|
+// Pass a context, along with the title of the dialog
|
|
|
+new ColorChooserDialog.Builder(this, R.string.color_palette)
|
|
|
+ .titleSub(R.string.colors) // title of dialog when viewing shades of a color
|
|
|
+ .accentMode(accent) // when true, will display accent palette instead of primary palette
|
|
|
+ .doneButton(R.string.md_done_label) // changes label of the done button
|
|
|
+ .cancelButton(R.string.md_cancel_label) // changes label of the cancel button
|
|
|
+ .backButton(R.string.md_back_label) // changes label of the back button
|
|
|
+ .preselect(accent ? accentPreselect : primaryPreselect) // optionally preselects a color
|
|
|
+ .dynamicButtonColor(true) // defaults to true, false will disable changing action buttons' color to currently selected color
|
|
|
+ .show(this); // an AppCompatActivity which implements ColorCallback
|
|
|
+```
|
|
|
+
|
|
|
+The Activity/Fragment you show the dialog in must implement `ColorCallback`:
|
|
|
+
|
|
|
+```java
|
|
|
+public class MyActivity implements ColorChooserDialog.ColorCallback {
|
|
|
+
|
|
|
+ // ...
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onColorSelection(ColorChooserDialog dialog, @ColorInt int color) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+You can also specify custom colors to be displayed if you don't want to use the built-in primary or accent
|
|
|
+color palettes (which consist of the entire Material Design Color Palette):
|
|
|
+
|
|
|
+```java
|
|
|
+int[] primary = new int[] {
|
|
|
+ Color.parseColor("#F44336")
|
|
|
+};
|
|
|
+int[][] secondary = new int[][] {
|
|
|
+ new int[] { Color.parseColor("#EF5350"), Color.parseColor("#F44336"), Color.parseColor("#E53935") }
|
|
|
+};
|
|
|
+
|
|
|
+new ColorChooserDialog.Builder(this, R.string.color_palette)
|
|
|
+ .titleSub(R.string.colors)
|
|
|
+ .customColors(primary, secondary)
|
|
|
+ .show(this);
|
|
|
+```
|
|
|
+
|
|
|
+The first parameter for primary colors can also take an array resource (`R.array.colors`), which can be
|
|
|
+seen in the sample project. If you pass `null` for the second parameter, there will be no sub levels displayed
|
|
|
+for top level colors.
|
|
|
+
|
|
|
+## Finding Visible Dialogs
|
|
|
+
|
|
|
+Since the `ColorChooserDialog` is a `DialogFragment`, it attaches to your Activity/Fragment through its `FragmentManager`.
|
|
|
+`ColorChooserDialog` has a utility method called `findVisible(AppCompatActivity, String)` that will
|
|
|
+find a visible color chooser if any is visible:
|
|
|
+
|
|
|
+```java
|
|
|
+ColorChooserDialog primary = ColorChooserDialog.findVisible(getSupportFragmentManager(), ColorChooserDialog.TAG_PRIMARY);
|
|
|
+
|
|
|
+ColorChooserDialog accent = ColorChooserDialog.findVisible(getSupportFragmentManager(), ColorChooserDialog.TAG_ACCENT);
|
|
|
+
|
|
|
+ColorChooserDialog custom = ColorChooserDialog.findVisible(getSupportFragmentManager(), ColorChooserDialog.TAG_CUSTOM);
|
|
|
+```
|
|
|
+
|
|
|
+## User Color Input
|
|
|
+
|
|
|
+By default, color chooser dialogs allow the user to input a custom color using RGB sliders or a Hexadecimal input field.
|
|
|
+This can be disabled if you don't want users to be able to use it:
|
|
|
+
|
|
|
+```java
|
|
|
+new ColorChooserDialog.Builder(this, R.string.color_palette)
|
|
|
+ .allowUserColorInput(false)
|
|
|
+ .customButton(R.string.md_custom_label)
|
|
|
+ .presetsButton(R.string.md_presets_label)
|
|
|
+ .show(this);
|
|
|
+```
|
|
|
+
|
|
|
+If you want the user to be able to input a custom color, but don't want them to be able to change transparency (alpha):
|
|
|
+
|
|
|
+```java
|
|
|
+new ColorChooserDialog.Builder(this, R.string.color_palette)
|
|
|
+ .allowUserColorInputAlpha(false)
|
|
|
+ .customButton(R.string.md_custom_label)
|
|
|
+ .presetsButton(R.string.md_presets_label)
|
|
|
+ .show(this);
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Preference Dialogs
|
|
|
+
|
|
|
+Android's `EditTextPreference`, `ListPreference`, and `MultiSelectListPreference` allow you to associate a preference activity's settings
|
|
|
+with user input that's received through typing or selection. Material Dialogs includes `MaterialEditTextPreference`,
|
|
|
+`MaterialListPreference`, and `MaterialMultiSelectListPreference` classes that can be used in your preferences XML to automatically use Material-themed
|
|
|
+dialogs. See the sample project for details.
|
|
|
+
|
|
|
+By default, all of these preference classes will set their layout to `R.layout.md_preference_custom`. If you
|
|
|
+don't want a default layout to be set, you can provide an attribute on the preferences in your XML:
|
|
|
+
|
|
|
+```
|
|
|
+app:useStockLayout="true"
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# File Selector Dialogs
|
|
|
+
|
|
|
+The Builder is used like this:
|
|
|
+
|
|
|
+```java
|
|
|
+new FileChooserDialog.Builder(this)
|
|
|
+ .initialPath("/sdcard/Download") // changes initial path, defaults to external storage directory
|
|
|
+ .mimeType("image/*") // Optional MIME type filter
|
|
|
+ .extensionsFilter(".png", ".jpg") // Optional extension filter, will override mimeType()
|
|
|
+ .tag("optional-identifier")
|
|
|
+ .goUpLabel("Up") // custom go up label, default label is "..."
|
|
|
+ .show(this); // an AppCompatActivity which implements FileCallback
|
|
|
+```
|
|
|
+
|
|
|
+The Activity/Fragment you show the dialog in must implement `FileCallback`:
|
|
|
+
|
|
|
+```java
|
|
|
+public class MyActivity implements FileChooserDialog.FileCallback {
|
|
|
+
|
|
|
+ // ...
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onFileSelection(FileChooserDialog dialog, File file) {
|
|
|
+ // TODO
|
|
|
+ final String tag = dialog.getTag(); // gets tag set from Builder, if you use multiple dialogs
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Folder Selector Dialogs
|
|
|
+
|
|
|
+The Builder is used like this:
|
|
|
+
|
|
|
+```java
|
|
|
+// Pass AppCompatActivity which implements FolderCallback
|
|
|
+new FolderChooserDialog.Builder(this)
|
|
|
+ .chooseButton(R.string.md_choose_label) // changes label of the choose button
|
|
|
+ .initialPath("/sdcard/Download") // changes initial path, defaults to external storage directory
|
|
|
+ .tag("optional-identifier")
|
|
|
+ .goUpLabel("Up") // custom go up label, default label is "..."
|
|
|
+ .show(this);
|
|
|
+```
|
|
|
+
|
|
|
+The Activity/Fragment you show the dialog in must implement `FolderCallback`:
|
|
|
+
|
|
|
+```java
|
|
|
+public class MyActivity implements FolderChooserDialog.FolderCallback {
|
|
|
+
|
|
|
+ // ...
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onFolderSelection(FolderChooserDialog dialog, File folder) {
|
|
|
+ // TODO
|
|
|
+ final String tag = dialog.getTag(); // gets tag set from Builder, if you use multiple dialogs
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+Optionally, you can allow users to have the ability to create new folders from this dialog:
|
|
|
+
|
|
|
+```java
|
|
|
+new FolderChooserDialog.Builder(this)
|
|
|
+ .chooseButton(R.string.md_choose_label) // changes label of the choose button
|
|
|
+ .initialPath("/sdcard/Download") // changes initial path, defaults to external storage directory
|
|
|
+ .tag("optional-identifier")
|
|
|
+ .allowNewFolder(true, R.string.new_folder) // pass 0 in the second parameter to use default button label
|
|
|
+ .show(this);
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# Simple List Dialogs
|
|
|
+
|
|
|
+Simple List Dialogs are a specific style of list dialogs taken from the Material Design Guidelines: https://www.google.com/design/spec/components/dialogs.html#dialogs-simple-dialogs
|
|
|
+
|
|
|
+This library's implementation is just a pre-made adapter that you can pass to the `MaterialDialog.Builder`.
|
|
|
+
|
|
|
+```java
|
|
|
+final MaterialSimpleListAdapter adapter = new MaterialSimpleListAdapter(new MaterialSimpleListAdapter.Callback() {
|
|
|
+ @Override
|
|
|
+ public void onMaterialListItemSelected(MaterialDialog dialog, int index, MaterialSimpleListItem item) {
|
|
|
+ // TODO
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+adapter.add(new MaterialSimpleListItem.Builder(this)
|
|
|
+ .content("username@gmail.com")
|
|
|
+ .icon(R.drawable.ic_account_circle)
|
|
|
+ .backgroundColor(Color.WHITE)
|
|
|
+ .build());
|
|
|
+adapter.add(new MaterialSimpleListItem.Builder(this)
|
|
|
+ .content("user02@gmail.com")
|
|
|
+ .icon(R.drawable.ic_account_circle)
|
|
|
+ .backgroundColor(Color.WHITE)
|
|
|
+ .build());
|
|
|
+adapter.add(new MaterialSimpleListItem.Builder(this)
|
|
|
+ .content(R.string.add_account)
|
|
|
+ .icon(R.drawable.ic_content_add)
|
|
|
+ .iconPaddingDp(8)
|
|
|
+ .build());
|
|
|
+
|
|
|
+new MaterialDialog.Builder(this)
|
|
|
+ .title(R.string.set_backup)
|
|
|
+ .adapter(adapter, null)
|
|
|
+ .show();
|
|
|
+```
|
|
|
+
|
|
|
+---
|