Как передать объект новому действию, изменить этот объект и обновить изменения в первом действии? [Дубликат]

1

Я пытаюсь сделать что-то вроде Idle RPG в Android Studio. У вас есть герой, который имеет некоторые атрибуты, такие как XP, уровень, здоровье, золото и т.д.

У меня есть главный экран, где отображается имя, XP и уровень. Затем я хотел бы открыть другое действие и сменить ХР, и когда я вернусь к первому экрану, ХР также будет обновлена там.

Как бы я поступил так?

Я заставил это работать, сделав объект Героя Синглтоном. Тем не менее, это вызывает у меня некоторые проблемы с дизайном, поэтому я предпочел бы использовать альтернативный метод.

Я также попытался передать объект с помощью намерений, но, похоже, он не обновляет изменения в основной деятельности. Пока что он просто обновляет атрибуты объекта во втором действии, но когда я закрываю это действие, ни одно из изменений не будет сохранено - даже когда я снова открою действие.

Я не очень разбираюсь в разработке приложений для Android, поэтому, возможно, я делаю что-то не так. Любая помощь будет оценена!

Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("hero", hero);
        startActivity(intent);
Hero hero = (Hero) getIntent().getSerializableExtra("hero");
hero.incxp();
Теги:
android-studio

4 ответа

1

Вы должны использовать startActivityForResult, чтобы отправить ваш объект во второй Activity. После обновления ваших значений во втором действии верните объект в первое действие и используйте его для обновления ваших значений. В первом упражнении:

Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("hero", hero);
    startActivityForResult(intent,101);

Во втором упражнении:

Hero hero = (Hero) getIntent().getSerializableExtra("hero");
hero.incxp();
Intent returnIntent = new Intent();
returnIntent.putExtra("hero",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Снова вернитесь в First Activity, переопределите ваш onActivityResultMethod, чтобы получить значение:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 101) {
    if(resultCode == Activity.RESULT_OK){
        Hero hero = (Hero) data.getSerializableExtra("hero");
        // update views with your new hero object
    }

}
}
  • 0
    Привет Мэтью, большое спасибо за ответ - я заставил его работать с помощью этого метода, и вы отлично ответили на мой вопрос, поэтому я просто хочу сказать, что я ценю ответ.
  • 0
    Счастлив, что смог помочь.
0

Прежде всего, если вы хотите, чтобы переменные исчезли после уничтожения приложения или чего-то подобного, затем используйте статическую переменную. Так что она доступна во всех классах.

public static String OBJ= obj;

Вы можете изменить переменную из любого класса. Но это не является предпочтительным, так как при неправильной обработке может возникнуть много условий гонки.

Если вы не хотите, чтобы оно сохранялось даже после уничтожения приложения, вы можете использовать Общие настройки в Android для сериализации объекта.

Gson gson = new Gson();
String json = gson.toJson(simDetails);

SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);
Editor e = prefs.edit();
e.putString(key, json);
e.commit();

Использование предпочтений - лучший способ, чем использование статической переменной.

Передача намерений также может быть выполнена, но это не лучший способ, так как требуется время для обновления, и это также подвержено гоночным условиям. Лучший способ - это Preferences, если не статическая переменная. Использование intent - последний выбор, который я бы предпочел.

0

Вы можете сохранить свои данные в общих настройках и получить данные, где вы хотите. Прежде чем я уже дал ответ, вы можете перейти по ссылке: -

Как контролировать хранение пользовательских данных с помощью SharedPreferences при входе и выходе?

0

В вашей первой деятельности:

Intent i = new Intent(this, SecondActivity.class);
i.putSerializableExtra("thing",thing);
startActivityForResult(i, 1);

затем во втором упражнении получите объект, который вы только что отправили:

myThing = getIntent().getSerializableExtra("thing");

и внесите в него изменения. Также убедитесь, что getIntent() != null, иначе getIntent() != null сбой.

и отправьте данные обратно, когда закроете это действие:

Intent returnIntent = new Intent();
returnIntent.putSerializableExtra("result", myThing);
setResult(Activity.RESULT_OK,returnIntent);
finish();

затем в первом упражнении вы можете переопределить этот метод:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 1) {
    if(resultCode == Activity.RESULT_OK){
        MyObjectType result=data.getSerializableExtra("result");
    }
    if (resultCode == Activity.RESULT_CANCELED) {
        //Write your code if there no result
    }
}
}//onActivityResult

Ещё вопросы

Сообщество Overcoder
Наверх
Меню