Android: данные, переданные с намерением, исчезают при возвращении из более глубокой иерархии

У меня есть OverviewActivity, которая содержит просмотр списка. Когда элемент выбран, создается намерение перейти к DetailActivity, и я передаю ему int.

Этот int присваивается закрытой переменной и используется для запроса к базе данных.

Код DetailActivity:

private int mIssueId;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_issue_detail);

    mIssueId = getIntent().getIntExtra(IssueOverviewFragment.INTENT_ISSUE_ID, -1);
    ...
}

В DetailActivity я могу перейти к GraphActivity. Но когда я нажимаю кнопку upButton в GraphActivity, приложение вылетает из-за того, что в DetailActivity переменная стала -1 (и, таким образом, база данных не может быть правильно запрошена).

Иерархия: OverviewActivity -> DetailActivity -> GraphActivity

Код GraphActivity:

protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_graph );

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        ...
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_detail, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_logout: {
            Utility.redirectToLogin(this);
            break;
        }
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

Как мне сохранить значения моего атрибута mIssueId в DetailActivity?

2 ответа

Решение

Намерение намеревается передавать информацию между действиями. Когда Activity1 передает управление Activity2, в основном это связано с поведением активности.

Если у вас есть информация, которую вы хотите поделиться в сложной иерархии или чтобы она была доступна для всего вашего приложения, вы можете выбрать между общими настройками, если вам нужно постоянство, или использовать класс Singleton, если данные будут нужны только во время работы приложения.

Это пример класса Singleton, в котором информация доступна для всего приложения:

public class AppData {
  private static AppData ourInstance = new AppData ();

  public int score;

  public static AppData getInstance () {
    return ourInstance;
  }
}

И как получить к нему доступ:

AppData.getInstance().score = 100;

Надеюсь, поможет.

Похоже, вы получаете значение по умолчанию, потому что возникла проблема с получением намерения в DetailActivity. Вы можете попытаться немного разбить ваш запрос

mIssueId = getIntent().getExtras().getInt();

Но я думаю, что проблема, вероятно, в том, как вы помещаете int в цель.

Это должно выглядеть примерно так

Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra(IssueOverviewFragment.INTENT_ISSUE_ID, mIssueId);
startActivity(intent);
Другие вопросы по тегам