San*_*dra 10 android buttonclick android-dialogfragment
我有Fragment扩展DialogFragment,我有一个自定义布局,它包含两个edittexts和两个按钮 - 确定和取消.我的对话框显示得很好,使用onCreateView方法指定布局,但我不知道如何处理按钮点击.在onCreateView方法中,button.setOnClickListener不起作用.这可能有一个简单的解决方案,但我被困了几个小时.我非常感谢建议或示例代码.
PS我不想使用AlertDialog,因为在这种情况下单击ok按钮时,对话框会自动解除自身,我无法对edittext进行验证(例如:当用户按下ok按钮和edittext的时候是空的我不希望对话框消失).这就是我选择创建自定义对话框并轻松管理按钮行为的方法.
这是我正在使用的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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下行创建对话框
confirm_dialog = new ConfirmDialog(this, message);
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG);
Run Code Online (Sandbox Code Playgroud)
接口定义用于确保调用者(Fragment或Activity)实现处理控制器抛出的事件的方法.也就是说,调用此对话框的Fragment或Activity必须实现给定的接口.
也许有一个更好的解决方案,但这是我想到的.希望能帮助到你!
这是一个例子,来自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;
}
}
Run Code Online (Sandbox Code Playgroud)
沿着这些路线
Dialog dl = mDialogFragment.getDialog();
Button btn = dl.findViewById(R.id.btn);
btn.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)
另一个选择是让您的自定义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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28962 次 |
| 最近记录: |