【问题标题】:How to keep a variable alive between all fragments如何使所有片段之间的变量保持活动状态
【发布时间】:2018-12-18 17:30:25
【问题描述】:

我的问题是,我有一个片段,我有一个菜单并选择一个需要应用于我拥有的每个片段的选项。

例如,在我的个人资料片段中,我需要为用户启用某个团队,该团队将影响每个片段,因为如果我在个人资料片段中选择美国作为团队,我将需要查看信息在我的其他片段中关于那个团队。

我的问题是,用单例做这个更好吗?所以我在我的个人资料中创建了一个选择实例,然后在其他片段中访问它。

这是一个好方法还是我需要以其他方式做到这一点?

【问题讨论】:

  • 您最好的选择是将值持久化到 Bundle 中,如果 Activity 是第一个打开且已保存的 Activity 且已保存InstanceState!=null 的情况下将其恢复,并将其放入片段视图中观察到的 MutableLiveData生命周期所有者。
  • 我认为 SharedPreferences 是持久化这些数据的最佳方式,因此可以从任何片段或活动中检索它
  • 您有多种选择。一些是(1)将其作为单例保存在内存中,(2)将其存储在包含所有Fragments 的Activity 中(假设它们共享一个活动),(3)使用持久存储选项(@987654323 @,一个文件,一个SQLiteDatabase)

标签: java android android-studio android-fragments


【解决方案1】:

这可以使用shared preferences 更好地处理。当您选择 United States 时,只需将其保存在共享首选项中的变量中,该变量将在整个应用程序中可用。

 Button updateTeamName = findViewById(R.id.btnupdateTeamName);
 updateTeamName.setOnClickListener(new View.OnClickListener() {
 @Override
    public void onClick(View v) {
        SharedPreferences.Editor editor = sharedpreferences.edit();
        editor.putString("team", "United States");
        editor.commit();
    }
 });

当点击按钮updateTeamName时,它会在共享偏好中添加一个条目,该条目将在整个应用程序中可用。

【讨论】:

    【解决方案2】:

    通常您希望保留团队、姓名、年龄等用户信息。

    如何持久化数据(以后可以在任何其他业务逻辑或视图中获取和重用)并不重要。 (可以是远程或本地数据库)

    我不建议将其存储到任何类型的生命周期,具体取决于 Android 技术,因为当应用程序终止时您可能会丢失数据。

    尝试通过某种持久层来存储数据。 恕我直言,您访问该持久层的方式可以通过单例对象处理对该层的访问来实现。

    我会为您添加各种资源,以找出最适合您需求的资源:

    https://developer.android.com/guide/topics/data/data-storage
    https://developer.android.com/topic/libraries/architecture/room
    https://github.com/futurice/android-best-practices#data-storage
    https://github.com/codepath/android_guides/wiki#persistence
    

    还可以查看 android 架构,您可能会了解它们如何处理不同片段和视图上的数据:

    https://github.com/googlesamples/android-architecture
    

    【讨论】:

      【解决方案3】:

      您需要创建一个类并用于存储静态变量。

      例如

      public class S{
       public static int sSocketTimeOutInMS = 50000;
      }
      

      现在您可以使用 S. 在活动和片段中的任何位置获取此变量 例如

      int SocketTimeOut = S.sSocketTimeOutInMS;

      【讨论】:

      • 不会在进程死亡后存活 =)
      • 正如 robin 所说,我不希望用户每次进入应用程序时都重新选择团队,我使用 sharedpreferences
      【解决方案4】:

      我所知道的当今应用程序的最佳方法是使用 Google Architecture Components 中的 ViewModel。您可以为所有 Fragment 共享一个 ViewModel,并使用 LiveData 观察每个 Fragment 的变化,就像之前有人告诉过您的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多