Instantly share code, notes, and snippets.
Created
May 19, 2020 09:27
-
Save Gkemon/99f6a2a45834c9f13e73f2d749bac9fc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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