【问题标题】:Best way to save a string from another activity从另一个活动中保存字符串的最佳方法
【发布时间】:2014-02-13 19:13:21
【问题描述】:

在活动 A 中获取字符串值并将其保存在活动 B 中的最佳方法是什么?
我认为Intents和SharedPreferences之间可能有关系!

有人吗?

【问题讨论】:

    标签: android android-intent android-activity sharedpreferences


    【解决方案1】:

    在活动 A 中获取字符串值并将其保存在活动 B 中的最佳方法是什么?

    这取决于您所说的“保存活动 B”是什么意思

    如果您只想将其“传递”给B 并在那里使用它,那么只需发送Intent

    Intent i = new Intent(..., ...);
    i.putExtra("someKey", someString);
    startActivity(i);
    

    并在B(而不是在onCreate()之前)使用类似的东西

    Intent intent = getIntent();
    String foo = intent.getStringExtra("someKey");
    

    如果您希望它真正持续存在,那么SharedPreferences 会很好。文档中有一个很好的例子。

    Intent Docs

    SharePreferences

    【讨论】:

    • 我成功使用了 SharedPreferences 但跳转到下一个活动,它没有显示在 textview 中,只是进入另一个活动并返回到上一个可见的活动:/
    • 查看我链接到的SharedPreferences 示例。您只需打开首选项并从那里检索它,您就可以在TextView 中使用它
    • 可以举个例子吗?
    • 我已经给了你一个但是here are some more good examples
    【解决方案2】:

    有不同的方法来解决这个问题,但您选择的方法实际上取决于您的需求,这篇文章解释了您可以采取的不同方法。

    http://www.doepiccoding.com/blog/?p=153

    基本上有:

    -共享首选项

    -Intent Extras

    -应用子类

    -SQLite 数据库

    都详细解释了...

    问候!

    【讨论】:

    • 我成功使用了 SharedPreferences 但跳转到下一个活动,它没有显示在 textview 中,只是进入另一个活动并返回到上一个可见的活动:/
    • 有“活动专用”首选项和“全局默认”共享首选项,请确保您使用的是具有整个应用范围的首选项,提供的帖子详细解释了该问题...跨度>
    【解决方案3】:

    您可以在 Intent 中存储不同的值。这是官方的谷歌示例: Google

    意图

    在活动 A 中:

    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";    
    
    Intent intent = new Intent(this, ActivityB.class);
    String message = "Your String";
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
    

    在活动 B 中:

    Intent intent = getIntent();
    String message = intent.getStringExtra(ActivityA.EXTRA_MESSAGE);
    

    Shared Preferences

    在活动 A 中:

    private static final String PREV_STRING_VALUE = "prevStringValue";
    
    String value = "yourString";
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    sp.edit().putString(PREV_STRING_VALUE, value).apply();
    

    在活动 B 中:

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    String value = sp.getString(ActivityA.PREV_STRING_VALUE, "DefaultValue");
    

    或其他一些方法:

    • SQLite Databases
    • Singleton 类(但如果需要持久数据,并不总是推荐)
    • 等等

    有很多方法可以传递您的数据。但是您需要哪种类型的实现始终取决于具体情况。如果您希望您的数据只传递给下一个活动/片段并且它是临时数据,那么只需使用意图。

    如果您在应用的进一步处理过程中需要数据,请使用 SQLite 数据库或 SharedPreferences(如果不是复杂数据)。保存您的价值,您可以随时随地访问它。

    【讨论】:

    • 但是当你关闭应用程序并返回它时会保存给用户吗?
    • 不,那么您将需要共享首选项或 SQLite 数据库。
    • 您无法识别 EditText 正在输入的应用程序!
    【解决方案4】:

    您可以通过多种方式做到这一点..

    有偏好的人

    例如

    int myVal = 16;
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    prefs.edit().putInt("MY_KEY",myVal).commit();
    

    那么,在你的下一个活动中

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    prefs.getInt("MY_KEY", 0); //Where 0 is the default value
    

    如你所说,你也可以使用意图

    int myVal = 16
    Intent intent = new Intent(); //Make your intent as you normally would
    intent.putExtra("MY_KEY", myVal);
    

    在您的下一个活动的onCreate() 中:

    int myVal = getIntent().getExtras().getInt("MY_VALUE");
    

    但是,这些是基本的实现。正如 Artoo Detoo 所说,有很多不同的方法可以做到这一点。您可以使用片段、静态类、其他捆绑包等来执行此操作。这取决于具体情况——最好使用意图方式,这样您就不会无缘无故地将值存储在首选项中。如果您只需要它从活动 A 转到活动 B,只需使用意图方法即可。如果您在许多不同的地方需要它但又不想跟踪它?使用首选项。

    【讨论】:

    • 什么是“上下文”?现在如何在文本视图中显示结果?
    • 上下文可以是任何上下文。尝试使用“这个”;其余的,请查阅一些教程,因为您要问的是以前已经回答过很多次的非常基本的问题。 developer.android.com/training/basics/firstapp/building-ui.html
    【解决方案5】:

    非常感谢所有帮助过我的人,我很高兴看到还有重要的人仍然关心我们。简单的解决方案是保存按钮的 id 之间的冲突,因为在所有活动中拥有相同的 id。Apenas 这个! 谢谢大家!

    【讨论】:

      【解决方案6】:

      在另一个活动中存储字符串值和恢复的简单方法是: 1)在第一个活动开始活动中,大多数返回结果为字符串(在创建最终 int 变量之前,如 RETURN_DATA_AS_STRING)

      Intent intent = new Intent(getApplicationContext(), ReturningResultActivity.class);
      startActivityintent(intent,RETURN_DATA_AS_STRING);
      

      2) 在存储数据的下一个活动中进行下一步:

      Intent intent = new Intent();
      intent.putExtra("SomeStringIdentifier", "this is resulting string");
      setResult(RESULT_OK,intent);
      

      3) 在第一个活动中覆盖 onActivityResult():

      @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              if (resultCode == RESULT_OK) {
                  switch (requestCode) {
                      case RETURN_DATA_AS_STRING: {
                          String thisIsResultStringFromAnotherActivity = data.getStringExtra("SomeStringIdentifier");
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多