从一个活动获取值到另一个活动

3

我应该如何使用savePreferencesloadPreferences方法在第一个活动中?

private static final String GLOBAL_PREFERENCES = "music_status";

public static void savePreferences(@NonNull Context context, String key, int value) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(key, value);
    editor.apply();
}...
protected void onResume() {
    super.onResume();

    musicGroup = (RadioGroup) findViewById(R.id.radioGroupForMusic);
    turnOn = (RadioButton) findViewById(R.id.radioButtonMusicOn);
    turnOff = (RadioButton) findViewById(R.id.radioButtonMusicOff);
    musicGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            switch (checkedId){
                case R.id.radioButtonMusicOff:
                    mediaPlayer.pause();
                    savePreferences(MainMenuActivity.this,"music_status",0);
                case R.id.radioButtonMusicOn:
                    mediaPlayer.start();
                    savePreferences(MainMenuActivity.this,"music_status",1);
            }
        }
    });

}

第二个活动中。
private static final String GLOBAL_PREFERENCES = "music_status";
public static int loadPreferences(@NonNull Context context, String key, int defaultValue) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    return sharedPreferences.getInt(key, defaultValue);
}

不过我不知道如何从第一个活动中获取值


2
什么是那个异常?发布logcat。 - Raghavendra
1
MainMenuActivity.status.. 这是一个静态变量吗?注意:建议使用Intents+Extras而不是静态变量。 - OneCricketeer
尽量不要使用活动。我会创建一个包含所需值的新类,并使两个活动都实现该类。 - selmaohneh
你能解释一下如何拥有两个活动但不在它们之间导航吗? - OneCricketeer
可能是重复的问题:如何在Android活动之间传递数据? - Sergey Shustikov
这是异常 "FATAL EXCEPTION: main Process: loc.nwd.splitball, PID: 2506 java.lang.NullPointerException: Attempt to invoke virtual method 'void loc.nwd.splitball.musicStatus.setStatus(int)' on a null object reference" - Bohua Jia
3个回答

4
短暂的回答是你不能这样做,除非你的status变量是静态的。但这对这种情况来说极其糟糕。
你有三个选择。

SharedPreferences

与我之前的修订相比,这可能是您的最佳选择。
如果您只想保存某些内容的状态,那么不使用类来保存音乐状态可能会更好,您可以像@cricket_007建议的那样实现SharedPreferences
您可以使用以下示例函数:
private static final String GLOBAL_PREFERENCES = "a.nice.identifier.for.your.preferences.goes.here";

public static void savePreferences(@NonNull Context context, String key, int value) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(key, value);
    editor.apply();
}

public static int loadPreferences(@NonNull Context context, String key, int defaultValue) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    return sharedPreferences.getInt(key, defaultValue);
}

您可以在代码中使用这些功能来保存您的音乐状态。不要使用status.setStatus(0);status.setStatus(1);,而是使用Utils.savePreferences(context, "music_status", 1);。不要使用status.getStatus(),而是使用Utils.loadPreferences(context, "music_status", 0);

Parcelable

您可以在您的musicStatus类中实现Parcelable接口。然后,您可以通过Intent将对象发送到第二个活动。下面是一个实现Parcelable接口的示例类。

一旦您拥有了这个类,您可以通过Intents像这样传递它:

musicStatus status = new musicStatus();
status.setStatus(8);
Intent intent = new Intent(this, HighScoreActivity.class);
intent.putExtra("status", status);
startActivity(intent);

类的实现:

public class musicStatus implements Parcelable {
    private int status;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status){
        this.status = status;
    }

    private musicStatus(Parcel in) {
        status = in.readInt();
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(status);
    }

    public static final Parcelable.Creator<musicStatus> CREATOR = new Parcelable.Creator<musicStatus>() {
        public musicStatus createFromParcel(Parcel in) {
            return new musicStatus(in);
        }

        public musicStatus[] newArray(int size) {
            return new musicStatus[size];
        }
    };

    public int describeContents() {
        return 0;
    }
}

单例模式

在这种情况下,单例模式确实是一种反模式。然而,它仍然是一种可能性。

public class musicStatus {
    private static musicStatus mInstance = null;
    private int status;

    @NonNull
    public static musicStatus getInstance() {
        if (mInstance == null) {
            synchronized(mInstance) {
                if (mInstance == null) {
                    mInstance = new musicStatus();
                }
            }
        }
    }

    public int getStatus(){
        return status;
    }

    public  void setStatus(int status){
        this.status = status;
    }
}

1
SharedPreferences 可能是另一个潜在的选择。 - OneCricketeer
是的,“public static musicStatus status;”我忘记粘贴了。 - Bohua Jia
不要这样做 @BohuaJia:那会导致Activity Context泄漏。因为静态的musicStatus将被永久引用! - Knossos
我刚开始学习安卓开发,您能告诉我如何使用“public class musicStatus implements Parcelable”吗?非常感谢。 - Bohua Jia
不知道如何使用loadPreference,因为我看到了int变量defaultValue,但我不知道如何设置它,所以我上传了我的问题。 - Bohua Jia
显示剩余4条评论

2
为了最简单的方式,您的musicStatus类需要实现Serializable接口。
Bundle bundle = new Bundle();
bundle.putSerializable("musicStatus", status);
intent.putExtras(bundle);

在其他活动中:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

musicStatus status=
               (musicStatus)bundle.getSerializable("musicStatus");

这个不起作用,它会导航到第二个活动。 - Bohua Jia
公共类音乐状态实现可序列化 { //你的代码 } 你做完了吗? - PLe

0

在你的POJO类中扩展Serviceable

在启动第二个Activity之后。

  intetn.putExtra("obj",pojoObj);

并在您的第二个活动中使用它。

PojoCls obj = (PojoCls)getIntent().getSerializableExtra("obj");

就是这样。


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