首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于方向变化的多个智能锁对话框

关于方向变化的多个智能锁对话框
EN

Stack Overflow用户
提问于 2016-03-23 17:28:38
回答 2查看 393关注 0票数 7

最近,我将谷歌的智能密码锁定功能整合到我的应用程序中,几乎所有事情都像预期的那样顺利运行。

有一个小问题我还无法解决:在ResultCallback#onResult中,如果下面的命令导致谷歌解析对话框的出现,该对话框询问是否通过智能锁保存凭据(请参阅附件图像),或者使用哪些凭据,如果智能锁中已经保存了多个凭据:

代码语言:javascript
复制
status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);

当出现分辨率对话框,用户进行一些方向更改时,分辨率对话框就会成倍增加,每个对话框都会重叠。作为用户,您首先不会看到对话框有多个副本,但如果您关闭了第一个副本(通过点击“从不”或“保存密码”),则最上面的对话框消失,显示下面另一个相同的对话框。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 18:46:36

您可以通过在活动开始和停止之间保持某种状态来处理这一问题。

请参见在此mIsResolving中使用样本代码变量。只需保存在调用onSaveInstanceState()并在onCreate()中恢复时是否已经有一个挂起的对话框,如果是这样的话,防止再次调用onActivityResult(),一旦收到onActivityResult()的意图,就清除状态。

代码语言:javascript
复制
private void resolveResult(Status status, int requestCode) {
    // We don't want to fire multiple resolutions at once since that can result
    // in stacked dialogs after rotation or another similar event.
    if (mIsResolving) {
        Log.w(TAG, "resolveResult: already resolving.");
        return;
    }
    if (status.hasResolution()) {
        try {
            status.startResolutionForResult(MainActivity.this, requestCode);
            mIsResolving = true;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
...
    if (savedInstanceState != null) {
        mIsResolving = savedInstanceState.getBoolean(KEY_IS_RESOLVING);
    }
...

@Override
protected void onSaveInstanceState(Bundle outState) {
...
    outState.putBoolean(KEY_IS_RESOLVING, mIsResolving);
...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
...
            mIsResolving = false;
...

对于许多应用程序来说,这是一个常见的陷阱,因此我们将研究是否可以在Play Services层中支持此状态,但就目前而言,对活动使用布尔值是维护解决方案状态的当前和一般建议。

票数 6
EN

Stack Overflow用户

发布于 2017-03-19 12:32:31

我知道,这是一个老问题,但最近我必须解决这个问题,在我的例子中,我在自定义类中使用status.startResolutionForResult(),我没有任何访问onSaveInstanceState()的权限(我可以使用接口进行一些自定义回调,但我不想这样做),但是在我的自定义类中,我有一个活动实例,所以在调用startResolutionForResult()之前,我总是在检查活动是否失去了焦点,因为对话框显示,如果是真的,我就打电话给startResolutionForResult(),否则我什么也不做。

代码语言:javascript
复制
@Override
public void onResult(@NonNull LocationSettingsResult result) {

    final Status status = result.getStatus();
    switch (status.getStatusCode()){
        case LocationSettingsStatusCodes.SUCCESS:

            getLocation();
            break;
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

            if (mActivity.hasWindowFocus()) {
                try {
                    status.startResolutionForResult(mActivity, SETTINGS_CHECK);
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            }
            break;
        case  LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

            mReceiver.unableToObtainLocation();
            break;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36184874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档