将一个 Activity 的引用传递给另一个 Activity

4
我知道可以使用意图(Intent)在Activity之间传递一些值。但是,如果我想传递整个Activity给另一个Activity,我认为这不是一个好的方法。是否有其他方法可以做到这一点?
我有一个设置(Settings) Activity,在其中我正在更改一些颜色。因此,当我回到主Activity时,我想应用这些颜色。为了做到这一点,在PreferenceActivity中,我需要在更改颜色值之后访问MainActivity字段。换句话说,我想从PreferenceActivity类中访问主Activity(Main activity)字段。有什么想法?
4个回答

3
你应该使用SharedPreference,然后在主活动中访问它。我建议你阅读http://developer.android.com/guide/topics/ui/settings.html,因为似乎你正在错误地实现设置活动。你可能特别感兴趣的部分是"读取首选项"部分。但我强烈建议你仔细阅读整个内容,然后以正确的方式实现设置。 更新回答,有三种不同的方法(我能想到的): 1) 使用startActivityForResult()启动首选项活动,然后在onActivityResult()中访问SharedPreference并进行必要的更改。请参见此处

2) 在你的 MainActivity 中注册一个 SharedPreferenceChangeListener,当任何更改发生在你的 SharedPreference 上时,它将被调用。详见 这里 以进行详细讨论。同时请查看我的初始回应。

3) 在你的 MainActivity 的 onResume() 方法中,访问 SharedPreference,然后在那里进行更改。我不喜欢这种方法,因为它会使 onResume() 方法变得混乱,并且你可能还需要一个变量来跟踪你感兴趣的变量的状态。

我个人会选择选项2,因为回调是为了这个精确目的而创建的。


我已经阅读了它,但是我希望在从PreferenceActivity返回后立即生效。 - Marek

0

我认为您可以通过使用putExtra(name, value)方法来传递值。在启动新活动之后,您可以使用getStringExtra(name)方法获取之前传递的值。


6
"Marek说:“我想要传递整个Activity…” - 不要尝试这样做。将更改保存到偏好设置中,在MainActivity中的onResume()方法中重新加载更改。或者使用 startActivityForResult(...),它允许您将数据作为一个 Bundle 返回给调用 Activity。" - Squonk
@Squonk,我按照你的建议做了。确实,我刚刚意识到传递整个活动是一个不好的想法。但是,你认为在某些情况下这样做可能更好吗?例如,如果我想改变很多数据怎么办?请将您的评论作为答案,这样最能满足我的需求,我想接受它。 - Marek

0

可以使用共享首选项。如果您希望立即反映更改,请添加监听器。请参考SharedPreferences.onSharedPreferenceChangeListener。这是一种简单的方法。


-1
如果你想要在许多活动中进行大量的更改,只需在任何一个活动中进行更改即可。
同时,可以访问所有活动中最后一次修改的数据并进行修改。
例如:

Constants.java

public class Constants
{

    public static String name;
}

在你的MainActivity中,你有一个editText

MainActivity.java

public class MainActivity extends Activity {

    private EditText yourName;
    private Button btn;

     @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    yourName = (EditText) findViewById(R.id.yourName);

    btn = (Button) findViewById(R.id.btn);

    btn.setOnClickListener(new OnClickListener()
    {       
        public void onClick(View v)
        {

            Constants.name = yourname.getText().toString();
            Intent intent = new Intent(getApplicationContext(),Activity2.class);
            startActivity(intent);

        }
    });

}

在你的Activity2中,你有一个TextView,它获取你在MainActivity.java中输入的值,而不需要通过Intent传递。

Activity2.java

public class Activity2 extends Activity {

    private TextView yourName;

     @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    yourName = (TextView) findViewById(R.id.tv_yourName);

    // directly use ferom serializable class
    yourname.setText(Constants.name);
}

就像你从所有活动中使用许多值并从所有活动中进行修改一样。


我认为在你提供的示例中,Constants类不需要是可序列化的。 - Marek
只需使用活动中的值,无需序列化即可实现...但与其他方式相比,它更容易实现。 - Mr.Sandy

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