super.finish() 不关闭应用程序
super.finish() does not close the app
我已经实现了按下后退按钮时显示的是/否对话框。如果用户点击 "yes I want to leave" 应用程序关闭。在我的模拟器中一切正常,但是当我在我的 phone 上安装应用程序时,单击 "yes" 应用程序会向后 step/action 并仅在它完成我的所有更改时关闭在里面做了。它只发生在我的 galaxy s4 上,最有趣的是,我一个月前在同一个 phone 上安装应用程序时没有遇到同样的问题。无论如何,这里是 yes no 对话的代码:
public class YesNoDialog extends DialogFragment {
Button btnYes, btnNo;
static String dialogTitle;
public interface YesNoDialogListener {
void onFinishYesNoDialog(boolean state);
}
public YesNoDialog(){
}
public void setDialogTitle(String title){
dialogTitle = title;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_yes_no_dialog, container, false);
btnYes = (Button) view.findViewById(R.id.btnYes);
btnNo = (Button) view.findViewById(R.id.btnNo);
getDialog().setTitle(dialogTitle);
btnYes.setOnClickListener(btnListener);
btnNo.setOnClickListener(btnListener);
return view;
}
private View.OnClickListener btnListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
YesNoDialogListener activity = (YesNoDialogListener) getActivity();
String state = ((Button) v).getText().toString();
if (state.equals("Yes")) {
activity.onFinishYesNoDialog(true);
} else {
dismiss();
}
}
};
}
在MainActivity
中:
@Override
public void onFinishYesNoDialog(boolean state) {
if (state){
super.finish();
}
}
private void showYesNoDialog() {
YesNoDialog yesNo = new YesNoDialog();
yesNo.setDialogTitle("Leaving Project Planner");
yesNo.show(mFragmentManager, "yes/no dialog");
}
public void onBackPressed() {
showYesNoDialog();
}
应该是
state.equalsIgnorecase("Yes")
并调用 finish()
而不是超级调用。
如果您不介意的话,我想再建议一些更改:)
不要比较 ViewClick
interface
中的字符串,您可以比较 id。
private View.OnClickListener btnListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch v.getId():
case R.id.btnYes:
dismiss();
callback.onFinishYesNoDialog();
break;
case R.id.btnNo:
dismiss();
break;
}
}
与其使用 setDialogTitle()
,不如创建一个静态方法,returns 初始化对话框参数的对话框实例。
像这样:
private String dialogTitle;
private YesNoDialogListener callback;
public static YesNoDialog newInstance(String title, YesNoDialogListener callback){
YesNoDialog d = new YesNoDialog();
d.dialogTitle = title;
d.callback = callback;
return d;
}
在 MainActivity
上初始化对话框:
YesNoDialog d = YesNoDialog.newInstance("My title...", this);
d.show(mFragmentManager, "yes/no dialog");
最后,您在 MainActivity
上的 callback
将如下所示:
@Override
public void onFinishYesNoDialog() {
finish();
}
我已经实现了按下后退按钮时显示的是/否对话框。如果用户点击 "yes I want to leave" 应用程序关闭。在我的模拟器中一切正常,但是当我在我的 phone 上安装应用程序时,单击 "yes" 应用程序会向后 step/action 并仅在它完成我的所有更改时关闭在里面做了。它只发生在我的 galaxy s4 上,最有趣的是,我一个月前在同一个 phone 上安装应用程序时没有遇到同样的问题。无论如何,这里是 yes no 对话的代码:
public class YesNoDialog extends DialogFragment {
Button btnYes, btnNo;
static String dialogTitle;
public interface YesNoDialogListener {
void onFinishYesNoDialog(boolean state);
}
public YesNoDialog(){
}
public void setDialogTitle(String title){
dialogTitle = title;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_yes_no_dialog, container, false);
btnYes = (Button) view.findViewById(R.id.btnYes);
btnNo = (Button) view.findViewById(R.id.btnNo);
getDialog().setTitle(dialogTitle);
btnYes.setOnClickListener(btnListener);
btnNo.setOnClickListener(btnListener);
return view;
}
private View.OnClickListener btnListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
YesNoDialogListener activity = (YesNoDialogListener) getActivity();
String state = ((Button) v).getText().toString();
if (state.equals("Yes")) {
activity.onFinishYesNoDialog(true);
} else {
dismiss();
}
}
};
}
在MainActivity
中:
@Override
public void onFinishYesNoDialog(boolean state) {
if (state){
super.finish();
}
}
private void showYesNoDialog() {
YesNoDialog yesNo = new YesNoDialog();
yesNo.setDialogTitle("Leaving Project Planner");
yesNo.show(mFragmentManager, "yes/no dialog");
}
public void onBackPressed() {
showYesNoDialog();
}
应该是
state.equalsIgnorecase("Yes")
并调用 finish()
而不是超级调用。
如果您不介意的话,我想再建议一些更改:)
不要比较 ViewClick
interface
中的字符串,您可以比较 id。
private View.OnClickListener btnListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch v.getId():
case R.id.btnYes:
dismiss();
callback.onFinishYesNoDialog();
break;
case R.id.btnNo:
dismiss();
break;
}
}
与其使用 setDialogTitle()
,不如创建一个静态方法,returns 初始化对话框参数的对话框实例。
像这样:
private String dialogTitle;
private YesNoDialogListener callback;
public static YesNoDialog newInstance(String title, YesNoDialogListener callback){
YesNoDialog d = new YesNoDialog();
d.dialogTitle = title;
d.callback = callback;
return d;
}
在 MainActivity
上初始化对话框:
YesNoDialog d = YesNoDialog.newInstance("My title...", this);
d.show(mFragmentManager, "yes/no dialog");
最后,您在 MainActivity
上的 callback
将如下所示:
@Override
public void onFinishYesNoDialog() {
finish();
}