java - 具有 Maincivity 的两项 Activity 会导致后退按钮无法正常工作

标签 java android android-intent android-activity

我有一个 MainActivity,我在这里发布部分代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.action_quit:
        moveTaskToBack(true);
        return true;
    case R.id.action_help:
        //display the help activity
        Intent myIntent = new Intent( this, ShowHelp.class);
        startActivityForResult(myIntent, 0);
        return true;
    case R.id.action_about:
        //display the about window
        //aboutApp();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
public void aboutApp() {
    // custom dialog
    final Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.about);
    dialog.setTitle("About TollCulator");

    TextView textViewAbout = (TextView) dialog.findViewById(R.id.tvContents);

    textViewAbout.setText("About: ");
    textViewAbout.append("\n\tTollCulator - Toll Calculator");
    textViewAbout.setMovementMethod(new ScrollingMovementMethod());
    Button btnCloseIt = (Button) dialog.findViewById(R.id.btnOk);
    // if button is clicked, close the custom dialog
    btnCloseIt.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
    ImageView iv1 = (ImageView) dialog.findViewById(R.id.imgFB);
    iv1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Uri uri = Uri.parse("https://www.facebook.com/PagesByZ");); 
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            dialog.cancel();
            startActivity(intent);
        }
    });
    dialog.show();
}

此处的 ShowHelp.class 部分代码本身就是一个 Activity:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case 16908332:
            Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
            startActivityForResult(myIntent, 0);
            //finish();
    }
    return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
    // do something on back.
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    //finish();
    return;
}

现在,当我从菜单中选择 action_help 时,它会打开 ShowClass Activity,我可以按后退按钮,它会让我毫无问题地返回到 MainActivity。

现在,如果我选择 action_about,则会弹出“关于”对话框,如果我单击对话框中的图标,则会弹出以下内容: enter image description here

此时,如果我决定按“返回”,而不是关闭弹出窗口并显示“关于”对话框,我只会进入主屏幕。

注释 ShowClass 中的 finish(); 方法允许我从“Complete action using”中单击“BACK”按钮,但它不会将我带到 MainActivity,而是将我带到 ShowClass从那里我可以再次按“后退”按钮返回到 MainActivity。因此,只要我先选择 action_help,按“返回”键就会返回 ShowHelp。

当“关于”对话框中弹出完整操作时,我设置了一个日志,它处于 onPause() 状态,如果我一开始没有运行 ShowHelp,我的应用程序将直接转到 onStop() 和 onDestroy ()。

请帮我解决这个问题。

为了测试它,我创建了一个没有 ShowHelp 类的演示,只有对话框,通过按后退按钮,使用对话框的完成操作将关闭,然后再次按后退将关闭关于对话框。所以我不确定发生了什么。

最佳答案

声明一个全局 boolean 变量chooserIsShowing:

boolean chooserIsShowing;

在这里将其设置为 true:

ImageView iv1 = (ImageView) dialog.findViewById(R.id.imgFB);
iv1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

        // set the flag
        chooserIsShowing = true;

        Uri uri = Uri.parse("https://www.facebook.com/PagesByZ");); 
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        dialog.cancel();
        startActivity(intent);
    }
});

更改重写的onBackPressed()方法:

@Override
public void onBackPressed() {

    if (!chooserIsShowing) {
        // do something on back.
        Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
        startActivityForResult(myIntent, 0);
        finish();
    }

    // remove the flag
    chooserIsShowing = false;
    return;
}

编辑1:

dialog 声明为全局变量:

Dialog dialog;

更改aboutApp():

public void aboutApp() {

    dialog = new Dialog(this);
    ....

}

重写 MainActivity 中的 onKeyDown(int, KeyEvent) 方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

您可以删除 chooserIsShowing,因为它不是必需的。

最终解决方案:

在 list 中为此 Activity 定义了 noHistory 标志。删除它并修复 ShowHelponBackPressed() 方法解决了该问题。

关于java - 具有 Maincivity 的两项 Activity 会导致后退按钮无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18280074/

相关文章:

java - 如何在java中的spring可重新加载消息资源中使用远程位置属性文件

android - 如何在应用程序打开时获取服务器更新?

android - 上传 apk 到 google play

android - 获取另一个 Activity 的值(value)放在另一个 Activity 的 ListView 的编辑文本中

java - 以 16 为底进行 pi 计算

java - 在 Java 中使用 "super"和 "?"

java - 泛型类型 : not applicable for the arguments

javascript - 当值太小时,high-charts datalabel 位置需要改变

java - 使用 Intent putExtra 的空指针异常

安卓 : How to listen MediaPlayer event like music play/stop?