Skip to content

Repository files navigation

EasyOptionMenu - Easy Multi Level Options Menu


Simple way to select Item Single or Multi


Content List


Download

Add maven jitpack.io and dependencies in build.gradle (Project) :

// build.gradle projectallprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
// build.gradle app/moduledependencies {
...
implementation 'com.google.android.material:material:1.2.1'
implementation 'com.github.gzeinnumer:EasyOptionMenu:version'
implementation 'com.github.gzeinnumer:SimpleMaterialStyle:last-vesion'//check on https://github.com/gzeinnumer/SimpleMaterialStyle
implementation 'com.github.gzeinnumer:EasyDialogFragment:last-vesion'//check on https://github.com/gzeinnumer/EasyDialogFragment
}

Feature List


Tech stack and 3rd library

  • Material.io (docs)
  • Multi and Single Selection in Recyclerview (docs) (example)
  • Android Slidr (docs) Spesial Thanks.

Usage

First Step. Use MaterialComponents in your style :

<stylename="AppTheme"parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>
<stylename="DynamicOptionMenuDefault"parent="Theme.MaterialComponents.Light.Dialog">
<itemname="colorPrimary">@color/colorPrimary</item>
<itemname="colorPrimaryDark">@color/colorPrimaryDark</item>
<itemname="colorAccent">@color/colorAccent</item>
<itemname="android:windowMinWidthMajor">80%</item>
<itemname="android:windowMinWidthMinor">80%</item>
<itemname="android:windowEnterAnimation">@anim/anim_in</item>
<itemname="android:windowExitAnimation">@anim/anim_out</item>
</style>

Add This Line to res/color.xml. Important

<?xml version="1.0" encoding="utf-8"?>
<resources>
<colorname="colorPrimary">#FF6200EE</color>
<colorname="colorPrimaryDark">#FF3700B3</color>
<colorname="colorAccent">#FF03DAC5</color>
</resources>

Type Data

  • Content Item there is 2 types data that you can sent to this dialog.

Type 1

ArrayList<String> level1 = newArrayList<>();
level1.add("Lorem ipsum dolor");
newDynamicOptionMenuBuilder<String>(getSupportFragmentManager())
.builder(level1)
.setTitle("Choise Brand")
...

Type 3 for this type you should override function toString() in your model pojo

publicclassExampleModel {
privateintid;
privateStringname;
privateStringaddress;
//constructor//getter//setter@OverridepublicStringtoString() {
returnname+"."+address;
}
}

And dont forget to declare your model pojo after DynamicOptionMenuBuilder<ModelPojo>

ArrayList<ExampleModel> level1 = newArrayList<>();
level1.add(newExampleModel(1, "Zein", "Balbar"));
newDynamicOptionMenuBuilder<ExampleModel>(getSupportFragmentManager())
.builder(level1)
.setTitle("Choise Brand")
...

Single Level Menu

Use only finalCallBack(...)

List<ExampleModel> level1 = newArrayList<>();
level1.add(newExampleModel(1, "Title 1", "Address 1"));
level1.add(newExampleModel(2, "Title 2", "Address 2"));
level1.add(newExampleModel(3, "Title 3", "Address 3"));
level1.add(newExampleModel(4, "Title 4", "Address 4"));
level1.add(newExampleModel(5, "Title 5", "Address 5"));
newDynamicOptionMenuBuilder<ExampleModel>(getSupportFragmentManager())
.builder(level1)
.setTitle("Choise Brand")
.finalCallBack(newDynamicOptionMenu.CallBackFinal<ExampleModel>() {
@OverridepublicvoidpositionItem(ExampleModeldata) {
appent("Level 1_" + data);
}
})
.show();

Multi Level Menu

  • 2 Level Menu Use addSub(...) and finalCallBack(...).

Use addSub(CallBack) and return you next level menu with same ModelPojo. example

.addSub(newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 1_" + data);
returnlevel2;
}
})

Full code. Just Copy and Paste it

List<ExampleModel> level1 = newArrayList<>();
List<ExampleModel> level2 = newArrayList<>();
level1.add(newExampleModel(1, "Title 1", "Address 1"));
level1.add(newExampleModel(2, "Title 2", "Address 2"));
level1.add(newExampleModel(3, "Title 3", "Address 3"));
level1.add(newExampleModel(4, "Title 4", "Address 4"));
level1.add(newExampleModel(5, "Title 5", "Address 5"));
level2.add(newExampleModel(6, "Title 1.1", "Address 6"));
level2.add(newExampleModel(7, "Title 1.2", "Address 7"));
level2.add(newExampleModel(8, "Title 1.3", "Address 8"));
level2.add(newExampleModel(9, "Title 1.4", "Address 9"));
level2.add(newExampleModel(10, "Title 1.5", "Address 10"));
newDynamicOptionMenuBuilder<ExampleModel>(getSupportFragmentManager())
.builder(level1)
.setTitle("Choise Brand")
.addSub(newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 1_" + data);
returnlevel2;
}
})
.finalCallBack(newDynamicOptionMenu.CallBackFinal<ExampleModel>() {
@OverridepublicvoidpositionItem(ExampleModeldata) {
appent("Level 2_" + data);
}
})
.show();

  • More Than 2 Level Menu Use addSub(CallBack[]) and finalCallBack(...).

Use addSub(CallBack[]) and return you next level menu with same ModelPojo, and do it again in next pojo. example

.addSub(
newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 1_" + data);
returnlevel2; //return level 2 menus
}
},
newDynamicOptionMenu.CallBack<ExampleModel>() {...},
newDynamicOptionMenu.CallBack<ExampleModel>() {...}
)

Full code. Just Copy and Paste it

List<ExampleModel> level1 = newArrayList<>();
List<ExampleModel> level2 = newArrayList<>();
List<ExampleModel> level3 = newArrayList<>();
List<ExampleModel> level4 = newArrayList<>();
level1.add(newExampleModel(1, "Title 1", "Address 1"));
level1.add(newExampleModel(2, "Title 2", "Address 2"));
level1.add(newExampleModel(3, "Title 3", "Address 3"));
level1.add(newExampleModel(4, "Title 4", "Address 4"));
level1.add(newExampleModel(5, "Title 5", "Address 5"));
level2.add(newExampleModel(6, "Title 1.1", "Address 6"));
level2.add(newExampleModel(7, "Title 1.2", "Address 7"));
level2.add(newExampleModel(8, "Title 1.3", "Address 8"));
level2.add(newExampleModel(9, "Title 1.4", "Address 9"));
level2.add(newExampleModel(10, "Title 1.5", "Address 10"));
level3.add(newExampleModel(11, "Title 1.1.1", "Address 11"));
level3.add(newExampleModel(12, "Title 1.1.2", "Address 12"));
level3.add(newExampleModel(13, "Title 1.1.3", "Address 13"));
level4.add(newExampleModel(14, "Title 1.1.1.1", "Address 14"));
level4.add(newExampleModel(15, "Title 1.1.1.2", "Address 15"));
newDynamicOptionMenuBuilder<ExampleModel>(getSupportFragmentManager())
.builder(level1)
.setTitle("Choise Brand")
//ignore if your menu only have 1 level
.addSub(
newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 1_" + data);
returnlevel2;
}
}, newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 2_" + data);
returnlevel3;
}
}, newDynamicOptionMenu.CallBack<ExampleModel>() {
@OverridepublicList<ExampleModel> positionItem(ExampleModeldata) {
appent("Level 3_" + data);
returnlevel4;
}
}
)
//add this callback. important line
.finalCallBack(newDynamicOptionMenu.CallBackFinal<ExampleModel>() {
@OverridepublicvoidpositionItem(ExampleModeldata) {
appent("Level 4_" + data);
}
})
.show();

  • Disable Filter
newDynamicOptionMenuBuilder<ExampleModel>(getSupportFragmentManager())
...
.setEnableFilter(false)
...

Preview :


Example Code/App

FullCode MainActivity

Example App


Version

  • 1.0.0
    • First Release
  • 1.0.1
    • New Filter Style
  • 1.1.0
    • Enable Filter
  • 1.1.1
    • Enablebackbutton true

Contribution

You can sent your constibution to branchopen-pull.


Copyright 2021 M. Fadli Zein

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages