安卓:在活动之间传递值

4
在我的Android应用程序中,我必须在所有活动中使用常见的字符串值。“commonValue”是我想要在所有活动中使用的常见字符串值。主要活动的相关代码如下:
public class TestActivity extends Activity {

 public String commonValue;//THE COMMON STRING FOR ALL ACTIVITIES

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    commonValue = "DemoValue";
  }
}

在我的下一个活动中,我创建了一个"TestActivity"类的对象,并尝试将"testValue"字符串赋给另一个名为"str"的字符串。
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.testlist);

    TestActivity obj = new TestActivity();//OBJECT OF MAIN ACTIVITY
    String str = obj.commonValue;
 }

但是第二个活动中的 "str" 值与我在第一个活动中分配的值不相等。为什么会这样,我该怎么做呢?

谢谢!


1
将声明的 public String commonValue 改为 public static String commonValue; 或者按照 Sana 的建议使用共享偏好。 - Akram
这种方式做不了吗? - Grant
否则,将commonValue初始化为public static String commonValue - Praveenkumar
你可以这样做,但使用静态变量并不安全,因为这些变量很容易被访问...此外,使用静态变量会导致内存泄漏。 - Venky
1
@Grant:我真心希望每次解释这个问题时都能得到一美元...TestActivity obj = new TestActivity();//OBJECT OF MAIN ACTIVITY. 你不能使用“new”关键字创建一个Activity实例。一个Activity要么是从Android应用程序启动器(当它被声明为使用MAIN/LAUNCHER)创建的,要么可以使用各种startActivity(...)方法启动。 - Squonk
显示剩余3条评论
8个回答

4
把你的值放在string.xml文件中。
 <string name="common_value">DemoValue</string>

并在任何类似的活动中使用。
String common_value = getApplicationContext().getString(R.string.common_value);

这个总是需要上下文的——我宁愿尝试避免这种情况。 - Tim
@TimMesserschmidt,那么为什么总是需要上下文呢? - Niranj Patel
你总是不得不在上下文中拖来拖去 - 例如在WorkerThread中。我更喜欢使用strings.xml来处理UI字符串。 - Tim
如果你正在使用findviewbyid,那么它也是在使用一种类型的上下文,所以我认为使用上下文没有任何负面影响。 - Niranj Patel

3

在你的应用程序中开始使用SharedPreferences

在你的第一个活动中,你可以这样做:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("commonValue", "DemoValue");
editor.commit();

在你的第二个活动中

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
String str = settings.getString("commonValue", null);

谢谢你的回答!我已经测试过这种方法了,只是需要尝试一下 :) - Grant
你的答案很完美...但我不想使用共享首选项。 :) - Grant
哦!如果你告诉我,我会使用静态对象方法:(,我渴望声誉...申请工作:| - Sana

1
如果值始终相同,您可以创建一个 public static final 变量,并通过 TestActivity.COMMON_VALUE 访问它。
如果要在两个活动之间传递值,应使用 Intents 并添加要传递的值的额外信息。

针对你在SpK的答案下被踩的评论,是我干的。正如我向他所解释的那样,在Java中你的回答是正确的,但是Android的Activity类是一个特殊情况,创建静态字段以供另一个“Activity”访问,这真的不是一个好的做法。如果新的Android程序员走这条路,并期望Activity跟任何其他Java类一样运作,那么事情将会出现严重问题。 - Squonk
嗨,Squonk,我已经发布了一种Android方式和一种Java方式 - 所以没有理由投反对票。在Android中通常会创建某种常量类,在其中使用共享常量。 - Tim
嗨,Tim - 恐怕是第一句话导致了负投票。我同意你指出了使用Intents传递数据的方法,但是将COMMON_VALUE声明为Activity(在OP的情况下为TestActivity)的static字段的想法是错误的。我同意“常量”类不是问题,我自己也使用它们...只是不要在“Activity”中使用静态字段。 - Squonk

1

试试这个 -

TestActivity.java

public class TestActivity extends Activity {

 public static String commonValue;//THE COMMON STRING FOR ALL ACTIVITIES

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    commonValue = "DemoValue";
  }
}

另一个活动

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.testlist);

    String str = TestActivity.commonValue;
}

不需要创建TestActivity的新实例,因为您正在访问类变量。 - Tim
1
没问题,现在好多了 - 减少对象创建对堆来说更好。顺便说一句,我也被踩了 (btw) ;) - Tim
不,我没有给你的答案投反对票,我是点了赞的……而且我也不知道是谁干的。 - Grant
1
@SpK:我将评分从1降到0-抱歉(不确定是谁做了另一个)。当有人在一个Android问题上打上Java标签时要小心。一个Activity不能被另一个Activity访问,也不应该使用new实例化或具有静态成员等...整个程序会崩溃。Activity类在Android中是一个特殊的情况。 - Squonk
@SpK:我希望你能意识到我没有恶意,我很惊讶OP接受了你的答案,因为我真的看不出来它能起作用。你的逻辑对于Java来说是正确的,只是Activity类是问题所在。顺便说一下,我没有再次给你点踩。 - Squonk

0
如Sana所建议的,使用SharedPreferences。
或者,使用全局常量类。如果您想坚持使用现有的代码,则可以尝试: String str = TestActivity.this.commonValue; 您现有的代码正在创建一个活动的新实例,因此它不会具有您设置的值。

0

对于每个应用程序,我们都有一个应用程序文件,您可以在其中声明变量。由于应用程序文件可以从任何活动中获取,因此使用公共getter/setter即可进行获取/设置。

还有其他各种方法可供使用,如 developer.androidhttp://developer.android.com/resources/faq/framework.html 中所述。

Singleton class
A public static field/method
A HashMap of WeakReferences to Objects (almost same as my above solution )
Persistent Objects

也要看看它们


0

commonValue 不等于你在 TestActivity 的 onCreate 方法中设置的值,原因是该函数尚未被调用。

这个问题的解决方案已经被其他人提出过了,例如将该值放入 bundle 中。


0

要在活动之间传递数据,请使用Bundle和方法。

intent.putExtra()

如果您想将数据设置为全局应用程序,则可以创建一个应用程序类,并在其中保存数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接