Skip to content

Instantly share code, notes, and snippets.

@Gkemon
Created May 19, 2020 09:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gkemon/99f6a2a45834c9f13e73f2d749bac9fc to your computer and use it in GitHub Desktop.
Save Gkemon/99f6a2a45834c9f13e73f2d749bac9fc to your computer and use it in GitHub Desktop.
import android.animation.AnimatorInflater;
import android.animation.StateListAnimator;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.fieldbuzz.utilities.validator_utility.Validator;
import com.fieldbuzz.widgets.R;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class DynamicMultipleButtonDialogBuilder extends DialogFragment {
public static final String POP_UP_DIALOG = "pop_alert_dialog";
public static String DIALOG_TITLE = "dialog-title";
public static String DIALOG_MESSAGE = "dialog-message";
public static String DIALOG_BUTTON_LIST = "dialog-button-list";
private static DynamicMultipleButtonDialogBuilder dynamicMultipleButtonDialogBuilder;
List<ButtonItem> buttonItems;
String title;
String message;
FragmentManager fragmentManager;
private Context context;
public static DynamicMultipleButtonDialogBuilder getInstance(){
dynamicMultipleButtonDialogBuilder = new DynamicMultipleButtonDialogBuilder();
return dynamicMultipleButtonDialogBuilder;
}
public DynamicMultipleButtonDialogBuilder(){
buttonItems = new ArrayList<>();
}
public DynamicMultipleButtonDialogBuilder setButtonItem(ButtonItem buttonItem) {
this.buttonItems.add(buttonItem);
return this;
}
public DynamicMultipleButtonDialogBuilder setMessage(String message) {
this.message=message;
return this;
}
public DynamicMultipleButtonDialogBuilder setTitle(String title) {
this.title=title;
return this;
}
public DynamicMultipleButtonDialogBuilder setFragmentManager(FragmentManager fragmentManager) {
this.fragmentManager=fragmentManager;
FragmentTransaction mFragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentByTag(POP_UP_DIALOG);
// Remove it if found
if (fragment != null) {
mFragmentTransaction.remove(fragment);
}
mFragmentTransaction.commitAllowingStateLoss();
return this;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
context = getActivity();
if (getArguments() != null) {
title = getArguments().getString(DIALOG_TITLE, "");
message = getArguments().getString(DIALOG_MESSAGE, "");
buttonItems = (ArrayList<ButtonItem>) getArguments().getSerializable(DIALOG_BUTTON_LIST);
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
AlertDialog alertDialog = builder.create();
alertDialog.setView(createView());
alertDialog.setCancelable(false);
return alertDialog;
}
private View createView() {
View mView;
mView = LayoutInflater.from(context).inflate(R.layout.dialog_dynamic_multiple_button, null);
TextView tvTitle = mView.findViewById(R.id.tv_dialog_title);
TextView tvMessage = mView.findViewById(R.id.tv_dialog_message);
if (Validator.isValid(title)) {
tvTitle.setText(title);
} else tvTitle.setVisibility(View.GONE);
if (Validator.isValid(message)) {
tvMessage.setText(message);
} else tvMessage.setVisibility(View.GONE);
RecyclerView recyclerView = mView.findViewById(R.id.rv_list);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2);
//It make the last button "Match parent" for balancing the UI
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (buttonItems.size() % 2 != 0) {
return (position == buttonItems.size() - 1) ? 2 : 1;
} else {
return 1;
}
}
});
recyclerView.setLayoutManager(gridLayoutManager);
ButtonAdapter buttonAdapter = new ButtonAdapter();
buttonAdapter.setButtonItemList(buttonItems);
recyclerView.setAdapter(buttonAdapter);
return mView;
}
public class ButtonAdapter extends RecyclerView.Adapter<ButtonViewHolder> {
List<ButtonItem> buttonItemList;
ButtonClickListener buttonClickListener;
public ButtonClickListener getButtonClickListener() {
return buttonClickListener;
}
public void setButtonClickListener(ButtonClickListener buttonClickListener) {
this.buttonClickListener = buttonClickListener;
}
public List<ButtonItem> getButtonItemList() {
return buttonItemList;
}
public void setButtonItemList(List<ButtonItem> buttonItemList) {
this.buttonItemList = buttonItemList;
}
@NonNull
@Override
public ButtonViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_multiple_dynamic_button_dialog, viewGroup, false);
return new ButtonViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ButtonViewHolder buttonViewHolder, int position) {
if(position>=0){
ButtonItem buttonItem = buttonItemList.get(position);
buttonViewHolder.button.setText(buttonItem.getName());
buttonViewHolder.button.setBackgroundColor(buttonItem.getBgColor());
buttonViewHolder.button.setTextColor(buttonItem.getTextColor());
if(buttonItem.getBgDrawable()!=null)
buttonViewHolder.button.setBackground(buttonItem.getBgDrawable());
else buttonViewHolder.button.setBackgroundColor(buttonItem.getBgColor());
}
buttonViewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonItemList.get(position).buttonClickListener.
onButtonClick(dynamicMultipleButtonDialogBuilder);
}
});
}
@Override
public int getItemCount() {
return buttonItemList.size();
}
}
class ButtonViewHolder extends RecyclerView.ViewHolder {
Button button;
public ButtonViewHolder(@NonNull View itemView) {
super(itemView);
button=itemView.findViewById(R.id.btn_item);
}
}
public void build()
{
Bundle args = new Bundle();
args.putString(DIALOG_TITLE, title);
args.putString(DIALOG_MESSAGE, message);
args.putSerializable(DIALOG_BUTTON_LIST,(Serializable)buttonItems);
dynamicMultipleButtonDialogBuilder.setArguments(args);
if(dynamicMultipleButtonDialogBuilder.isVisible())
dynamicMultipleButtonDialogBuilder.dismiss();
dynamicMultipleButtonDialogBuilder.show(fragmentManager,POP_UP_DIALOG);
}
public static class ButtonItem implements Serializable {
String name;
int bgColor;
int textColor;
Drawable bgDrawable;
ButtonClickListener buttonClickListener;
public ButtonItem(String name,Drawable bgDrawable, int textColor, ButtonClickListener buttonClickListener) {
this.name = name;
this.textColor = textColor;
this.bgDrawable = bgDrawable;
this.buttonClickListener = buttonClickListener;
}
public Drawable getBgDrawable() {
return bgDrawable;
}
public void setBgDrawable(Drawable bgDrawable) {
this.bgDrawable = bgDrawable;
}
public int getTextColor() {
return textColor;
}
public void setTextColor(int textColor) {
this.textColor = textColor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBgColor() {
return bgColor;
}
public void setBgColor(int bgColor) {
this.bgColor = bgColor;
}
public ButtonClickListener getButtonClickListener() {
return buttonClickListener;
}
public void setButtonClickListener(ButtonClickListener buttonClickListener) {
this.buttonClickListener = buttonClickListener;
}
public ButtonItem(String name, int bgColor, int textColor, ButtonClickListener buttonClickListener) {
this.name = name;
this.bgColor = bgColor;
this.textColor = textColor;
this.buttonClickListener = buttonClickListener;
}
}
public interface ButtonClickListener {
void onButtonClick(DynamicMultipleButtonDialogBuilder dynamicMultipleButtonDialogBuilder);
}
}
///Dialog XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_rectangle_solid_button_white">
<LinearLayout
android:id="@+id/layout_child"
style="@style/childLayoutTheme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:orientation="vertical">
<TextView
android:id="@+id/tv_dialog_title"
style="@style/textStyleLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:textStyle="bold" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginBottom="8dp"
android:background="@color/colorPrimary" />
<TextView
android:id="@+id/tv_dialog_message"
style="@style/textStyleLarge"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:textStyle="normal" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/layout_child"
android:layout_centerInParent="true">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
///Dialog XML
///Dialog button item
<?xml version="1.0" encoding="utf-8"?>
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="center"
android:id="@+id/btn_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/_10sdp">
</Button>
///Dialog button item
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment