我有一个从DialogFragment派生的自定义对话框。
当用户点击“确定”按钮时,我需要保存屏幕上的信息。
所以我让我的PositiveButton调用dismiss并且我实现了onDismiss方法来保存数据。
在onDismiss方法中,我需要从Dialog上的editView获取数据。 我正在使用getView()。findViewByID来获取editView,但方法GetView()返回null。
这是我的代码:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_signin, null))
.setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().dismiss();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().cancel();
}
});
return builder.create();
}
@override
public void onDismiss(){
EditView view = (EditView)getView().findViewByID(R.id.edit);
}
我知道我可以将OnCreateDialog中膨胀的视图保存为属性,但这对我来说似乎不对。
如何在onDismiss中从屏幕上获取视图的正确方法?
Ps:我工作的地方不允许我发布我的代码,所以我从谷歌中获取了一些代码,并将其更改为尽可能接近我的代码。
答案 0 :(得分:3)
我登录DialogFragment
的方式是通过对片段的父活动使用回调方法,如下所示:
builder.setPositiveButton("Login", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
EditText username = (EditText) getDialog().findViewById(R.id.username);
EditText password = (EditText) getDialog().findViewById(R.id.password);
un = username.getText().toString();
pw = password.getText().toString();
if (un.equals("") || pw.equals("")) {
Toast.makeText(getActivity(), "Username or Password field was empty", Toast.LENGTH_SHORT).show();
//Don't login & do something (I made a recursive callback to the fragment that created the dialog)
}
else if (!un.equals("username") || !pw.equals("password")) {
Toast.makeText(getActivity(), "Username or Password was incorrect", Toast.LENGTH_SHORT).show();
//Don't login & do something (I made a recursive callback to the fragment that created the dialog)
}
else if (un.equals("username") && pw.equals("password")) {
Toast.makeText(getActivity(), "You have logged in successfully", Toast.LENGTH_SHORT).show();
mLogin.Login();
}
然后回调方法Login()
将创建所需的下一个片段。
将创建登录对话框的片段在其回调方法中将包含以下代码:
LoginDialog login = new LoginDialog();
login.show(getFragmentManager(), "LOGIN");
答案 1 :(得分:3)
老而金。这个允许对整个片段进行更大的控制(例如,在实现seekBar或使用ButterKnife时)。够了说:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.dialog_signin, null);
// do your stuff with views here
builder.setView(view)
.setPositiveButton(R.string.signin, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().dismiss();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
LoginDialogFragment.this.getDialog().cancel();
}
});
return builder.create();
}
我知道我可以将OnCreateDialog中膨胀的视图保存为属性,但这对我来说似乎不对。
是的,就是那个。它看起来是正确的,特别是在实现seekBar之类的东西时以及使用像ButterKnife这样的库时。