android - 关于配置更改和上下文的 Activity 重新创建的解释

标签 android

我是 Android 开发的新手,我正在寻找有关我面临的问题的解释,以便更深入地了解 Android。

我有这段代码:

someAutoCompleteTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            ((AutoCompleteTextView)v).showDropDown();
        else
            ((AutoCompleteTextView)v).dismissDropDown();
    }       
});

如果下拉列表可见并且配置发生变化(屏幕方向),我将收到 BadTokenException。

我知道该 Activity 已被销毁并创建了一个新 Activity 来替换它,但我不太明白到底发生了什么以及为什么我会收到该异常, 毕竟,创建了一个新的 Activity ,新的听众注册到新的 View ,旧的听众被销毁。

我知道我可以通过告诉 list 我将自己处理配置更改来解决这个问题,但我正在寻求更深入的理解。

谢谢!

最佳答案

我想当您处于横向模式时,并且当 AutoCompleteTextView 获得焦点时,这个可编辑字段会切换到“全屏模式”,即只有值和键盘显示在屏幕上。

所以我猜在这种情况下,下拉菜单永远不可见,这就是 showDropDown() 抛出异常的原因。

为避免这种情况,请在您的代码中添加以下行:

someAutoCompleteTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
    public void onFocusChange(View v, boolean hasFocus) {

        if (v.getWindowVisibility() != View.VISIBLE) {
            return;
        }

        if (hasFocus)
            ((AutoCompleteTextView)v).showDropDown();
        else
            ((AutoCompleteTextView)v).dismissDropDown();
    }       
});

关于android - 关于配置更改和上下文的 Activity 重新创建的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037364/

相关文章:

java - 在带有时间延迟的 TextView 中显示字符 - android

java - 无法将 UTC 转换为 IST,它仍然只返回 UTC

android - 在 Android 中拒绝来电

android - 在android中用于编码和编辑视频的过程

java - 遍历泛型类

java - 使用屏幕导航按钮移动位图对象

java - 如何将此方法 AsyncTask 转换为 RxAndroid

android - 在 android 上运行并打印报告

android - 图标在操作栏上的优先级(保持项目顺序)

java - 为什么我的 android volley 的 http post 请求会抛出错误(localhost)?