【问题标题】:How do I set up a global variable to share among views in Android?如何设置全局变量以在 Android 中的视图之间共享?
【发布时间】:2013-11-27 05:26:33
【问题描述】:

在我的一个观点中,用户做出了选择。我想将该选择存储在一个变量中,我可以在所有视图中使用它,以便它可以用于进一步的数据库查询,例如“bookId”。

如何使“bookId”成为设置在一个视图上并在需要时可以跨其他视图访问的全局变量?

----- 编辑:我根据 cmets 和答案尝试做的事情 -----

在存储 SharedPreference 的主要活动中,我在 onCreate 之前有这个:

public static final String PREFS_NAME = "myPrefs";
SharedPreferences settings;
Integer bookId;

在我的 onCreate 中我已经这样做了:

settings = getSharedPreferences(PREFS_NAME, 0);
bookId = settings.getInt("bookId", 0);

按下按钮后,我将存储一个自定义属性并尝试在 SharedPreference 中设置 bookId:

SharedPreferences.Editor editor = settings.edit();
editor.putInt("bookId",bookKey);
editor.commit();

在另一个视图中,我尝试从 SharedPreference 中获取 bookId,出于测试目的,我尝试将存储的值设置为 textView,以确保它正确存储和传递。

在第二个视图的 onCreate 之前:

public static final String PREFS_NAME = "myPrefs";
SharedPreferences settings;

在onCreate里面:

settings = getSharedPreferences(PREFS_NAME, 0);
Integer bookId = settings.getInt("bookId", (Integer) null);
tempBookTextView = (TextView) findViewById(R.id.tempBookTextView);
tempBookTextView.setText(bookId);

我有两个问题,到目前为止,这看起来如何?我使用时应用程序崩溃的任何想法

Integer bookId = settings.getInt("bookId", (Integer) null);

【问题讨论】:

  • 考虑使用 SharedPreference?我在最近的应用程序中使用了它。您可以在一个活动中设置键值对并在其他活动中获取该值。
  • 什么是学习如何使用 SharedPreference 的好资源。 (我还在学习)。
  • Application 类比 SharedPreferences 更有用,如果该变量不时更改值。
  • @dcp3450 我最近添加了另一个问题的答案。检查此link。如果有帮助,请告诉我,我会将其发布为答案:-)

标签: android global-variables


【解决方案1】:

尝试使用SharedPreferences,而不是使用全局变量通过应用程序访问变量值。

示例活动:

public class Book extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";
     String mBookId = null;
    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       mBookId = settings.getString("book_id", null);
       // use book_id;
    }

    @Override
    protected void onStop(){
       super.onStop();

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putString("book_id", mBookId);

      // Commit the edits!
      editor.commit();
    }
}

首选项通常是私有的,可以通过所有应用程序组件访问。很少使用具有全球可读或可写首选项文件的其他应用程序共享数据,因为外部组件需要知道文件的确切文件名和位置。

【讨论】:

  • (Integer) null 将此替换为 0,应用程序不会崩溃。 Null 不能转换为整数。
  • 就是这样!如果有人遇到这个问题,我将这个答案/示例与这个视频一起使用:youtube.com/watch?v=wG3XPdVPsxU
【解决方案2】:

杀死封装之灵,

public class Globals {
    public static int x;
    public static int y;
}

以后

if (Globals.x == 0) { ... }

但请不要完全这样做,任何类都可以包含静态变量,为您要存储的值找到一个负责的类。

OTOH,android 进程可能会在您不期望的情况下重新启动,在这种情况下,所有变量都将被重置。所以最好使用共享首选项,如果它们不能按预期工作(我在至少一个 Android 版本中看到过),请将共享首选项的实例存储在静态变量中。

【讨论】:

    【解决方案3】:

    你可以使用Shared Preferences

    立即保存!

    SharedPreferences.Editor editor =  PreferenceManager.getDefaultSharedPreferences(ProjectAct.this).edit();
    editor.putInteger(StaticVariable.BOOKID, "1");
    p.get("contract_no"));
    editor.commit();
    

    然后像这样从任何地方打电话

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    int book_id = prefs.getInteger(StaticVariable.BOOKID,null);
    

    How to use SharedPreferences in Android to store, fetch and edit values查看更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多