Дополнительные функции, кажется, потеряны onResume()

У меня есть намерение, которое получает информацию из моей базы данных через длинный дополнительный. Он также устанавливает заголовок от Activity до String Extra.

Теперь, когда я впервые запускаю Activity, все отображается отлично. Однако у меня есть еще одно действие, которое я использую для добавления новых элементов базы данных. Проблема в том, что когда я нажимаю кнопку «Назад» (логотип на панели действий со стрелкой рядом с ним), возвращаясь к исходному действию, кажется, что «Дополнения» исчезли, потому что заголовок и ListView пусты.

Вот действие, которое без проблем отображает ListView при запуске:

DaysActivity.java:

package com.gauvion.gfit;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class DaysActivity extends ListActivity {

    private DaysDataSource datasource;
    private SimpleCursorAdapter dataAdapter;
    private boolean isEditing = false;
    private Toast toast_deleted;
    private String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };
    private int[] to;
    private long routineDataID;
    private String routineDataName;

    @SuppressLint("ShowToast")
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_days);
        routineDataID = getIntent().getLongExtra("routineDataID", 1);
        routineDataName = getIntent().getStringExtra("routineDataName");
        setTitle(routineDataName);

        toast_deleted = Toast.makeText(this, "", Toast.LENGTH_SHORT);
        datasource = new DaysDataSource(this);
        datasource.open();

        Cursor cursor = datasource.fetchAllDays(routineDataID);
        to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
        dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
        setListAdapter(dataAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {     
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_days, menu);
        return true;        
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {     
        Cursor cursor = datasource.fetchAllDays(routineDataID);
        switch (item.getItemId()) {
            case R.id.button_days_add:
                Intent startDayAdd = new Intent(this, DayAddActivity.class);
                startDayAdd.putExtra("routineDataID", routineDataID);
                this.startActivity(startDayAdd);
                return true;

            case R.id.button_days_edit:
                to = new int[] { R.id.listitem_day_edit_name, R.id.listitem_day_edit_day };
                dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day_edit, cursor, columns, to, 0);
                setListAdapter(dataAdapter);

                isEditing = true;
                invalidateOptionsMenu();
                return true;

            case R.id.button_days_edit_done:
                to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
                dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
                setListAdapter(dataAdapter);

                isEditing = false;
                invalidateOptionsMenu();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        menu.findItem(R.id.button_days_edit).setVisible(!isEditing);
        menu.findItem(R.id.button_days_edit_done).setVisible(isEditing);

        return true;
    }

    @Override
    protected void onResume() {
        datasource.open();
        Cursor cursor = datasource.fetchAllDays(routineDataID);
        dataAdapter.changeCursor(cursor);

        super.onResume();
    }

    @Override
    protected void onPause() {
        datasource.close();
        super.onPause();
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);

      savedInstanceState.putLong("routineDataID", routineDataID);
      savedInstanceState.putString("routineDataName", routineDataName);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);

      routineDataID = savedInstanceState.getLong("routineDataID");
      routineDataName = savedInstanceState.getString("routineDataName");
    }

} 

Как видите, я даже пытался использовать onSaveInstanceState() и onRestoreInstanceState(). Может я не правильно их использую?

Вот действие, которое я собираюсь использовать для добавления новых дней:

DayAddActivity.java:

package com.gauvion.gfit;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;

public class DayAddActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_day_add);
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_day_add, menu);
        return true;
    }

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

}

Это ничего не делает прямо сейчас. Но, как я уже сказал, когда я нажимаю кнопку «Назад» (логотип на панели действий), он возвращается к DaysActivity, но заголовок и ListView пусты. Иерархическим родительским элементом для DayAddActivity является DaysActivity.

DayAddActivity будет иметь кнопку "Сохранить", которая добавит новый день в базу данных, а затем finish(). Я предполагаю, что снова столкнусь с этой проблемой, если не решу ее сейчас.


person scarhand    schedule 26.12.2012    source источник


Ответы (1)


Вы почти правильно понимаете. Все, что вы помещаете в onSaveInstanceState(), когда ваша активность умирает, должно быть получено в новом экземпляре вашего Activity внутри метода onCreate().

У вас должно быть что-то вроде:

@SuppressLint("ShowToast")
@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_days);

    Bundle bundle = savedInstanceState != null ? savedInstanceState : getIntent().getExtras();
    routineDataID = bundle.getLongExtra("routineDataID", 1);
    routineDataName = bundle.getStringExtra("routineDataName");
    setTitle(routineDataName);

    //other stuff
}

Итак, да, в основном метод getIntent() используется при первом отображении вашего Activity. После этого вы получите дополнения, которые вы сохранили в onSaveInstanceState().

person Snicolas    schedule 26.12.2012
comment
нет, в onCreate. Посмотрите, как я получаю дополнительные услуги из намерения или из сохраненного пакета. Это должно быть в onCreate, так как вы получите пакет, который вы сохранили в onSaveInstanceState, в качестве параметра. OnResume не имеет аргументов... - person Snicolas; 26.12.2012
comment
хорошо, я понял проблему. когда я нажимаю кнопку «назад/домой» в DayAddActivity, намерение НЕ NULL для DaysActivity, поэтому оно не использует переменные saveInstanceState. Как я могу это исправить? - person scarhand; 26.12.2012
comment
да я это уже пробовал. сохраненное состояние экземпляра всегда равно нулю. мне нужно вызвать saveinstancestate перед началом следующего действия? Я думал, что это сделало это автоматически. - person scarhand; 26.12.2012
comment
похоже, что использование общих настроек может быть выходом, это просто не работает. - person scarhand; 26.12.2012
comment
он будет вызван автоматически. Я почти уверен, что вы ошиблись. Это работает. - person Snicolas; 26.12.2012
comment
это не работает. я буквально использовал код, который вы предоставили. когда я возвращаюсь из DayAddActivity, переменные больше не устанавливаются. - person scarhand; 26.12.2012
comment
я сделал новый вопрос, относящийся к этому: stackoverflow.com/questions/14044588/ - person scarhand; 26.12.2012