My app shows many custom dialog like Yes/No or Accept/Cancel decissions and, while I was coding, I realized that there are so much code repeated, following the same schema.
I want to build a general class but I don't know how to do it or, more exactly, the correct way that I have to do it(interfaces, abstract classes, inheritance, static classes, ...)
This is my current class:
public class DialogTwoOptions extends Dialog { TextView title_tv; // Button yes_btn, no_btn; public DialogTwoOptions(Context context) { super(context); setContentView(R.layout.dialogo_sino); // a simple layout with a TextView and Two Buttons title_tv = (TextView) findViewById(R.id.dialogo_titulo_sino); // yes_btn = (Button) findViewById(R.id.dialogo_aceptar); // no_btn = (Button) findViewById(R.id.dialogo_cancelar); View v = getWindow().getDecorView(); v.setBackgroundResource(android.R.color.transparent); } public void quitDialog(View v) { if (isShowing()) dismiss(); } public void setTitle(String title) { title_tv.setText(title); }
}
And this is what I am doing when I need to use this class:
final DialogTwoOptions dialog = new DialogTwoOptions(this); Button yes = (Button) dialog.findViewById(R.id.dialog_yes_btn); Button no = (Button) dialog.findViewById(R.id.dialog_no_btn); yes.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { dialog.dismiss(); // Do something } }); no.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { dialog.dismiss(); // Do something } }); dialog.show();
I am sure that it is improvable, but how could you do this?
Thanks
First create an Base DialogFragment
to keep hold of the instance of the Activity
. So when the Dialog is attached to the Activity
, you will know the instance of the Activity
which created it.
public abstract class BaseDialogFragment<T> extends DialogFragment { private T mActivityInstance; public final T getActivityInstance() { return mActivityInstance; } @Override public void onAttach(Activity activity) { mActivityInstance = (T) activity; super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); mActivityInstance = null; } }
Then, create a GeneralDialogFragment
which extends the BaseDialogFragment
public class GeneralDialogFragment extends BaseDialogFragment<GeneralDialogFragment.OnDialogFragmentClickListener> { // interface to handle the dialog click back to the Activity public interface OnDialogFragmentClickListener { public void onOkClicked(GeneralDialogFragment dialog); public void onCancelClicked(GeneralDialogFragment dialog); } // Create an instance of the Dialog with the input public static GeneralDialogFragment newInstance(String title, String message) { GeneralDialogFragment frag = new GeneralDialogFragment(); Bundle args = new Bundle(); args.putString("title", title); args.putString("msg", message); frag.setArguments(args); return frag; } // Create a Dialog using default AlertDialog builder , if not inflate custom view in onCreateView @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle(getArguments().getString("title")) .setMessage(getArguments().getString("message")) .setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Positive button clicked getActivityInstance().onOkClicked(GeneralDialogFragment.this); } } ) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // negative button clicked getActivityInstance().onCancelClicked(GeneralDialogFragment.this); } } ) .create(); } }
If you need to use your own custom layout for dialog,then inflate a layout in onCreateView
and remove onCreateDialog
. But Add the click listeners in onCreateView
like i explained in onCreateDialog
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_dialog, container, false); return view; }
Then , In your Activity
need to implement an interface
to handle the action in dialog
public class TryMeActivity extends FragmentActivity implements GeneralDialogFragment.OnDialogFragmentClickListener { @Override public void onOkClicked(GeneralDialogFragment dialog) { // do your stuff } @Override public void onCancelClicked(GeneralDialogFragment dialog) { // do your stuff } }
Finally, Show the Dialog
from your Activity
when required, like this
GeneralDialogFragment generalDialogFragment = GeneralDialogFragment.newInstance("title", "message"); generalDialogFragment.show(getSupportFragmentManager(),"dialog");
Hope this helps. I am sure this approach is one of the optimized way, but there could be also different approaches .
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With