0

我有一个 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 部分代码在这里,它是一个独立的活动:

@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弹出关于对话框,如果我单击对话框中的图标,则会弹出以下内容: 在此处输入图像描述

此时如果我决定按 BACK,而不是关闭弹出窗口并显示我的 About 对话框,我只是被带到主屏幕。

在 ShowClass 中评论该finish();方法允许我从“使用完成操作”中单击 BACK 按钮,但不是将我带到 MainActivity,而是从那里到 ShowClass,我可以再次按下 Back 按钮以返回 MainActivity。因此,只要我action_help先选择,按返回就会让我回到 ShowHelp。

当从 About 对话框中弹出 Complete action using 时,我设置了一个 Log,它处于 onPause() 状态,如果我一开始没有运行 ShowHelp,我的 App 直接进入 onStop() 和 onDestroy()。

请帮我解决问题。

为了测试它,我创建了一个没有 ShowHelp 类的演示,只有对话框,通过按返回按钮,使用对话框的 Complete actiong 关闭,然后再次按返回关闭 About 对话框。所以我不确定发生了什么。

4

1 回答 1

1

声明一个全局布尔变量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);
    ....

}

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

@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它不是必需的。

最终解决方案:

noHistory在清单中为此活动定义了一个标志。删除它并解决问题的修复onBackPressed()方法。ShowHelp

于 2013-08-16T18:55:35.970 回答