Android 处理 DialogFragment 中的按钮点击
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12112061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
handle button clicks in a DialogFragment
提问by Sandra
I have Fragment that extends DialogFragment and I have a custom layout for it which contains two edittexts and two buttons - ok and cancel. My dialog displays just fine, using the onCreateView method for specifying the layout, but I don't know how to handle button clicks. Inside the onCreateView method, button.setOnClickListener doesn't work. This may have a simple solution, but I am stuck for several hours. I would very much appreciate an advice or example code.
我有扩展 DialogFragment 的 Fragment,我有一个自定义布局,其中包含两个编辑文本和两个按钮 - 确定和取消。我的对话框显示得很好,使用 onCreateView 方法指定布局,但我不知道如何处理按钮点击。在 onCreateView 方法中, button.setOnClickListener 不起作用。这可能有一个简单的解决方案,但我被困了几个小时。我非常感谢建议或示例代码。
P.S I don't want to use AlertDialog, because in this case when clicking on the ok button, the dialog automatically dismisses itself, and I can't do a validation on the edittext's (example: when the user presses ok button and the edittext's are empty I don't want the dialog to disappear). That is way I went with the option for creating a custom dialog and easily manage the buttons behavior.
PS我不想使用AlertDialog,因为在这种情况下,当点击ok按钮时,对话框会自动关闭,我无法对edittext进行验证(例如:当用户按下ok按钮和edittext的是空的,我不希望对话框消失)。这就是我选择创建自定义对话框并轻松管理按钮行为的方式。
采纳答案by nandeesh
Do along these lines
沿着这些路线做
Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
回答by type-a1pha
This is the code for a Dialog I'm using (the actual GUI for the dialog is defined in the layout resource confirm_dialog.xml):
这是我正在使用的对话框的代码(对话框的实际 GUI 在布局资源 confirm_dialog.xml 中定义):
public class ConfirmDialog extends DialogFragment {
public static String TAG = "Confirm Dialog";
public interface ConfirmDialogCompliant {
public void doOkConfirmClick();
public void doCancelConfirmClick();
}
private ConfirmDialogCompliant caller;
private String message;
public ConfirmDialog(ConfirmDialogCompliant caller, String message){
super();
this.caller = caller;
this.message = message;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.confirm_dialog, container, false);
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
((TextView) view.findViewById(R.id.textview_confirm)).setText(message);
((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// When button is clicked, call up to owning activity.
caller.doOkConfirmClick();
}
});
((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// When button is clicked, call up to owning activity.
caller.doCancelConfirmClick();
}
});
return view;
}
}
The dialog is created with the following lines
该对话框是用以下几行创建的
confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
The interface definition is used to assure that the caller (Fragment or Activity) implements the methods to handle the events thrown by the controller. That is, a Fragment or Activity calling this dialog must implement the given interface.
Maybe there is a better solution but this is the one I figured out. Hope it helps!
接口定义用于确保调用者(Fragment 或 Activity)实现处理控制器抛出的事件的方法。也就是说,调用此对话框的 Fragment 或 Activity 必须实现给定的接口。
也许有更好的解决方案,但这是我想出的解决方案。希望能帮助到你!
回答by Gal Rom
here is an example to handel a cancel button click on a dialog from the FragmentDialog class:
这是一个在 FragmentDialog 类中单击对话框上的取消按钮的示例:
i used android.support.v4.app.DialogFragment;
我用 android.support.v4.app.DialogFragment;
public class MyDialogFragment extends DialogFragment {
public MyDialogFragment(){}
public static String TAG = "info Dialog";
Button btn;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.info_layout, container);
getDialog().requestWindowFeature(STYLE_NO_TITLE);
btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
getDialog().dismiss();
}
});
return view;
}
}
回答by Suragch
Another option is to let your custom DialogFragment
class implement OnClickListener
. Then you just setOnClickListener
for whatever views you want to handle clicks on and catch the clicks in onClick
.
另一种选择是让您的自定义DialogFragment
类实现OnClickListener
. 然后,您只需setOnClickListener
处理您想要处理的任何视图点击并捕获onClick
.
// 1. implement OnClickListener
public class MyDialogFragment extends DialogFragment implements View.OnClickListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.my_dialog_layout, null);
// 2. set click listeners on desired views
view.findViewById(R.id.my_view_1).setOnClickListener(this);
view.findViewById(R.id.my_view_2).setOnClickListener(this);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view)
// ...
return builder.create();
}
// 3. capture the clicks and respond depending on which view
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.my_view_1:
// do something
break;
case R.id.my_view_2:
// do something
break;
default:
break;
}
}
}
回答by Sam
Its easy in activity but in DialogFragment we do some more codes.
它在活动中很容易,但在 DialogFragment 中我们做了更多的代码。
Inside the DialogFragment class do your rutin findView on onActivityCreated
method
在 DialogFragment 类中执行你的 rutin findView ononActivityCreated
方法
btn_ocak = (Button) view.findViewById(R.id.btn_cal_ocak);
btn_subat = (Button) view.findViewById(R.id.btn_cal_subat);
btn_mart = (Button) view.findViewById(R.id.btn_cal_mart);
btn_nisan = (Button) view.findViewById(R.id.btn_cal_nisan);
btn_ocak.setOnClickListener(this);
btn_subat.setOnClickListener(this);
btn_mart.setOnClickListener(this);
btn_nisan.setOnClickListener(this);
Implement onClick OnClickListener to your class
为您的类实现 onClick OnClickListener
public class CalendarPopUp extends DialogFragment implements View.OnClickListener
and do what you want inside onClick method, by doing these we activated the onClick events of our views
并在 onClick 方法中执行您想要的操作,通过执行这些操作,我们激活了视图的 onClick 事件
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_cal_ocak:
seciliAy = "Ocak";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_subat:
seciliAy = "Subat";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_mart:
seciliAy = "Mart";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_nisan:
seciliAy = "Nisan";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_mayis:
seciliAy = "May?s";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_haziran:
seciliAy = "Haziran";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_temmuz:
seciliAy = "Temmuz";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_agustos:
seciliAy = "Agustos";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_eylul:
seciliAy = "Eylül";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_ekim:
seciliAy = "Ekim";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_kasim:
seciliAy = "Kas?m";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
case R.id.btn_cal_aralik:
seciliAy = "Aral?k";
setMonthOnShare(seciliAy);
mCallback.onSelectedData(seciliAy);
dismiss();
break;
default:
break;
}
}
and if you wonder how to pass values follow these step clike_here
如果您想知道如何传递值,请按照以下步骤 clike_here
回答by Peter
or
或者
class MyDialog extends DialogFragment {
public View.OnClickListener onButtonOk;
public EditText edit_text;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater li = LayoutInflater.from(builder.getContext());
View view = li.inflate(R.layout.custom_dialog, null);
Button buttonOK = view.findViewById(R.id.button_ok);
edit_text = view.findViewById(R.id.edit_text);
buttonOk.setOnClickListener(onButtonOk);
builder.setView(view);
return builder.create();
}
}
// use
final MyDialog dialog=new MyDialog();
dialog.onButtonOk=new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), dialog.edit_text.getText(), Toast.LENGTH_SHORT).show();
}
};
dialog.show(getSupportFragmentManager(),null);