問題描述
我的應(yīng)用程序顯示了許多自定義對(duì)話框,例如是/否或接受/取消決定,當(dāng)我編寫代碼時(shí),我意識(shí)到有很多代碼重復(fù),遵循相同的架構(gòu).
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.
我想構(gòu)建一個(gè)通用類,但我不知道該怎么做,或者更確切地說,我必須做的正確方法(接口、抽象類、繼承、靜態(tài)類……)
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, ...)
這是我目前的課程:
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);
}
}
當(dāng)我需要使用這個(gè)類時(shí),這就是我正在做的事情:
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();
我確信它是可以改進(jìn)的,但是你怎么能這樣做呢?
I am sure that it is improvable, but how could you do this?
謝謝
推薦答案
首先創(chuàng)建一個(gè) Base DialogFragment
來保存 Activity
的實(shí)例.因此,當(dāng) Dialog 附加到 Activity
時(shí),您將知道創(chuàng)建它的 Activity
的實(shí)例.
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;
}
}
然后,創(chuàng)建一個(gè)擴(kuò)展 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();
}
}
如果您需要為對(duì)話框使用自己的自定義布局,請(qǐng)?jiān)?onCreateView
中填充布局并刪除 onCreateDialog
.但是像我在 onCreateDialog
中解釋的那樣在 onCreateView
中添加點(diǎn)擊監(jiān)聽器
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;
}
那么,在你的Activity
中需要實(shí)現(xiàn)一個(gè)interface
來處理dialog
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
}
}
最后,在需要時(shí)顯示 Activity
中的 Dialog
,像這樣
Finally, Show the Dialog
from your Activity
when required, like this
GeneralDialogFragment generalDialogFragment =
GeneralDialogFragment.newInstance("title", "message");
generalDialogFragment.show(getSupportFragmentManager(),"dialog");
希望這會(huì)有所幫助.我確信這種方法是優(yōu)化的方法之一,但也可能有不同的方法.
Hope this helps. I am sure this approach is one of the optimized way, but there could be also different approaches .
這篇關(guān)于在java Android中為自定義Dialog創(chuàng)建一個(gè)通用類的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!