Android 在对话框片段中单击句柄按钮
我有一个扩展DialogFragment的片段,我有一个自定义布局,其中包含两个EditText和两个按钮-ok和cancel。我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮单击。在onCreateView方法中,button.setOnClickListener不工作。这可能有一个简单的解决方案,但我被困了几个小时。我将非常感谢您的建议或示例代码 另外,我不想使用AlertDialog,因为在这种情况下,当点击ok按钮时,对话框会自动关闭,我无法对edittext进行验证(例如:当用户按下ok按钮,edittext为空时,我不希望对话框消失)。这就是我选择创建自定义对话框并轻松管理按钮行为的方法。按照这些方法操作Android 在对话框片段中单击句柄按钮,android,buttonclick,android-dialogfragment,Android,Buttonclick,Android Dialogfragment,我有一个扩展DialogFragment的片段,我有一个自定义布局,其中包含两个EditText和两个按钮-ok和cancel。我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮单击。在onCreateView方法中,button.setOnClickListener不工作。这可能有一个简单的解决方案,但我被困了几个小时。我将非常感谢您的建议或示例代码 另外,我不想使用AlertDialog,因为在这种情况下,当点击ok按钮时,对话框会自动关闭,我无法对edi
Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
这是我正在使用的对话框的代码(对话框的实际GUI在布局资源confirm_Dialog.xml中定义): 将使用以下行创建该对话框
confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
接口定义用于确保调用方(片段或活动)实现处理控制器抛出的事件的方法。也就是说,调用此对话框的片段或活动必须实现给定的接口。也许有更好的解决办法,但这就是我想出来的。希望有帮助 以下是从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;
}
}
另一个选项是让自定义的
对话框片段
类实现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;
}
}
}
这在活动中很容易,但在DialogFragment中,我们会编写更多的代码 在DialogFragment类中,在ActivityCreated方法上查看rutin findView
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;
}
}
如果您想知道如何传递值,请遵循以下步骤
或
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);
谢谢你。我已经找到了这样的解决方案。buttonOk.setOnClickListener(新视图.OnClickListener(){@Override public void onClick(视图视图){}});但也许你的解决方案也能奏效。反正是Thx
getDialog()
返回空值!这样设置onClickListener对我不起作用。它给了我错误。我找到了解决问题的方法,并将其作为对第一个答案的评论。不管怎样,谢谢您的回复。如果您从xml资源中扩展布局,这是有效的。如果您是以编程方式创建布局,那么在按钮引用上就有了ta调用setOnClickListener。我遇到的问题是:myButton.setOnClickListener(新OnClickListener(){}给了我错误,所以解决方案是使用myButton.setOnClickListener(新视图.OnClickListener(){}.我不知道为什么它没有以这种方式识别我的侦听器,但它确实识别了..这是我想到的同一个解决方案,但我犹豫是否采用这种方式,因为片段应该有默认构造函数。此外,我不知道如何将接口设为“调用者”在Args Bundle中。你知道吗?当你的片段被重新实例化(例如在配置更改后或在后台被销毁)并且你点击一个按钮后,这将与NPE一起崩溃。当片段管理器重新创建片段时,会调用默认构造函数。
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);