【问题标题】:Unable to finish activity from onOptionsItemSelected in Android无法从 Android 中的 onOptionsItemSelected 完成活动
【发布时间】:2015-10-30 04:51:08
【问题描述】:

我正在尝试从菜单选项关闭活动。当 menuItem menu_close_activity 被选中时,(并且在调试时)我注意到调试器总是从 return true 步骤跳转到默认值。 我尝试使用ActivityClassName.this.finish(),但仍然得到相同的结果

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_xxxx:
                break;
            case R.id.menu_yyyy:
                break;
            case R.id.close_activiy:
                // doing some stuff here;
                setResult(0001);
                finish();    // Debugger jumps from here
                return true;
            default:
                return super.onOptionsItemSelected(item); // Debugger jumps to here.
        }
    }

为什么我要跳转到默认值,而不是返回 true?


除了这个方法,public boolean onCreateOptionsMenu(Menu menu) 什么都不做,只是增加了选项菜单,protected void onCreate(Bundle savedInstanceState)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_name_list);
        Bundle b = getIntent().getExtras();
        name = b.getString("name");
        setTitle("Students of " + name);
    }

【问题讨论】:

  • 编译器还是调试器?
  • 你能发布你的全班吗?可能是返回语句的问题。尝试休息。
  • 为什么 R.id.menu_log_out 不在 switch case 条件下? R.id.close_activiy 是什么?这是菜单项吗?
  • 小心使用 0001 作为数字 - 它将被解释为八进制 - 请参阅:stackoverflow.com/questions/8254077/…

标签: android android-activity


【解决方案1】:

我看不出您的活动没有完成的原因。它应该。您能否将一些日志添加到 onDestroy() 方法并查看它是否被调用。

至于为什么Debugger 会跳转,好吧,在这种情况下不要相信调试器。我认为它跳跃是因为不同线程中发生了不同的事情。而是添加一些日志以查看实际发生的情况。用以下代码替换您的代码并检查日志。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_xxxx:
            break;
        case R.id.menu_yyyy:
            break;
        case R.id.close_activiy:
            // doing some stuff here;
            Log.d("DEBUG","BEFORE FINISH = "+item.toString());
            setResult(1);
            finish();    // Compiler jumps from here
            Log.d("DEBUG","AFTER FINISH = "+item.toString());
            return true;
        default:
            Log.d("DEBUG","DEFAULT STATEMENT = "+item.toString());
            return super.onOptionsItemSelected(item); // Compiler jumps to here.
    }
}

【讨论】:

  • 10-27 21:37:19.259 2066-2066/com.example.mohgeis.driveschoolapp I/DEBUG:完成前 = 关闭 10-27 21:37:19.273 2066-2066/com.example .mohgeis.driveschoolapp I/DEBUG:完成后 = 关闭 10-27 21:37:19.498 2066-2097/com.example.mohgeis.driveschoolapp W/EGL_emulation:eglSurfaceAttrib 未实现 10-27 21:37:19.499 2066-2097/ com.example.mohgeis.driveschoolapp W/OpenGLRenderer:无法在表面 0xad75ffa0 上设置 EGL_SWAP_BEHAVIOR,错误 = EGL_SUCCESS 10-27 21:37:19.721 2066-2097/com.example.mohgeis.driveschoolapp E/Surface:getSlotFromBufferLocked:未知缓冲区: 0xab7d6130
  • 确实没有默认语句在我运行app使用日志的时候没有触发,但是上层activity返回的resultCode是0而不是1
  • 活动即将结束。我发现调试误导了我,并把我带错了方向,这很奇怪,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多