小编Har*_*789的帖子

BottomNavigationView + 在导航到不同选项卡时保存片段状态

BottomNavigationView用于底部标签。

1) Tab 1 - 从服务器获取数据并显示到RecyclerView
2) Tab 2 - 从服务器获取 URL 并加载Webview
3) Tab 3 - 从服务器获取数据并显示到RecyclerView
4) Tab 4 - 设置屏幕使用PreferenceFragmentCompat

为了在用户切换选项卡时保存这些片段的状态,我使用了此博客中的以下代码

保存Fragment.SavedStateSparseArray<Fragment.SavedState>

Fragment.State currentFragmentState = getSupportFragmentManager().saveFragmentInstanceState(currentFragment)
Run Code Online (Sandbox Code Playgroud)

当用户导航回之前的选项卡时再次恢复状态

fragment.setInitialSavedState(savedState)

getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.container_fragment, fragment, tag)
        .commit();
Run Code Online (Sandbox Code Playgroud)

我看到的是只有 Tab 4(设置屏幕 PreferenceFragmentCompat)保持状态 - 如果我向下滚动到第 10 个项目并在导航到其他片段后再次返回设置屏幕,我会在顶部看到第 10 个位置。

但是,前三个选项卡会再次调用 Web 服务,并且所有内容都会重新加载。另外,我可以看到前三个选项卡Bundle savedInstanceStateonCreateView方法参数也不为空。

我的问题是

1) PreferenceFragmentCompat(4th tab ) 如何自动恢复状态?
2)如何在前三个选项卡中使用非空Bundle savedInstanceStateonCreateView方法的参数)并像第四个选项卡一样恢复状态? …

android android-fragments android-design-library bottomnavigationview

5
推荐指数
1
解决办法
3681
查看次数

在 Android 中迁移到最新的 Google Drive API 时出错 - 已超出未经身份验证使用的每日限制。继续使用需要注册

应用程序发布在 Play 商店中,它使用“应用程序数据文件夹”使用Drive API进行备份-恢复。一切正常。但是,根据 Google 的公告,该 API 即将在 2019 年 12 月 6 日被拒绝。因此,为了支持现有用户,我一直根据迁移指南官方示例应用程序迁移到最新的 API 。

我可以使用下面的代码(来自官方链接)成功进行身份验证。

GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                                         .requestEmail()
                                         .requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
                                         .build();
GoogleSignInClient client = GoogleSignIn.getClient(this, signInOptions);

// The result of the sign-in Intent is handled in onActivityResult.
startActivityForResult(client.getSignInIntent(), REQUEST_CODE_SIGN_IN);
Run Code Online (Sandbox Code Playgroud)

我也在使用正确的范围 - DriveScopes.DRIVE_APPDATA如官方文档中所述。

我还在里面看到了“电子邮件”和“授予范围”的正确值 onActivityResult()

if (requestCode == REQUEST_CODE_SIGN_IN && resultCode == RESULT_OK) {

   GoogleSignIn.getSignedInAccountFromIntent(data).addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
                @Override
                public void onSuccess(GoogleSignInAccount googleSignInAccount) {

                    Log.e("TAG", "Email - " …
Run Code Online (Sandbox Code Playgroud)

android oauth-2.0 google-drive-api google-drive-android-api

4
推荐指数
1
解决办法
531
查看次数