我有Fragment扩展DialogFragment,我有一个自定义布局,包含两个edittexts和两个按钮 - 确定和取消。我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮点击。在onCreateView方法中,button.setOnClickListener不起作用。这可能有一个简单的解决方案,但我被困了几个小时。我非常感谢建议或示例代码。
PS我不想使用AlertDialog,因为在这种情况下单击ok按钮时,对话框会自动关闭,我无法对edittext进行验证(例如:当用户按下ok按钮时并且edittext是空的我不希望对话框消失)。这就是我选择创建自定义对话框并轻松管理按钮行为的方法。
答案 0 :(得分:9)
这是我正在使用的Dialog的代码(对话框的实际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;
}
}
使用以下行创建对话框
confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
接口定义用于确保调用者(Fragment或Activity)实现处理控制器抛出的事件的方法。也就是说,调用此对话框的Fragment或Activity必须实现给定的接口 也许有一个更好的解决方案,但这是我想到的。希望它有所帮助!
答案 1 :(得分:8)
这是一个例子,用来点击FragmentDialog类中对话框的取消按钮:
我使用了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;
}
}
答案 2 :(得分:6)
沿着这些方向行事
Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
答案 3 :(得分:6)
另一个选择是让您的自定义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;
}
}
}
答案 4 :(得分:1)
它的活动很简单,但在DialogFragment中我们会做更多的代码。
在DialogFragment类中,在onActivityCreated
方法
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);
将onClick OnClickListener实现到您的类
public class CalendarPopUp extends DialogFragment implements View.OnClickListener
并在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;
}
}
如果您想知道如何传递值,请按照以下步骤操作 clike_here
答案 5 :(得分:0)
或
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);