【问题标题】:Extras seem to be lost onResume()额外内容似乎丢失 onResume()
【发布时间】:2012-12-26 13:37:30
【问题描述】:

我有一个 Intent,它通过一个长的 Extra 从我的数据库中获取信息。它还通过String Extra 设置Activity 的标题。

现在,当我第一次启动 Activity 时,一切都显示得很完美。但是,我有另一个 Activity 用于添加新的数据库项目。问题是,当我按下后退按钮(操作栏中的标志,旁边有一个箭头),回到原来的 Activity 时,似乎 Extras 消失了,因为标题和 ListView 是空的。

这是启动时显示 ListView 没有问题的 Activity:

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()。如果我现在不解决这个问题,我假设我会再次遇到这个问题。

【问题讨论】:

    标签: android android-intent android-activity extra


    【解决方案1】:

    你几乎做对了。当您的活动即将结束时,您放置在onSaveInstanceState() 中的所有内容都必须在onCreate() 方法内的Activity 的新实例中获得。

    你应该有类似的东西:

    @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
    }
    

    所以,是的,第一次显示Activity 时基本上使用getIntent() 方法。之后您将获得保存在onSaveInstanceState() 中的额外内容。

    【讨论】:

    • 不,在 onCreate 中。看看我从意图或保存的捆绑包中获取额外内容的方式。这必须在 onCreate 中,因为您将在 onSaveInstanceState 中收到您保存的包作为参数。 OnResume 没有参数...
    • 好的,我发现了问题所在。当我按下DayAddActivity 中的返回/主页按钮时,DaysActivity 的意图不是 NULL,因此它没有使用 savedInstanceState 变量。我该如何解决这个问题?
    • 是的,我已经尝试过了。保存的实例状态始终为空。我必须在开始下一个活动之前调用 saveinstancestate 吗?我以为它会自动完成。
    • 看起来使用 sharedpreferences 可能是可行的方法,但这根本行不通。
    • 它会被自动调用。我很确定你犯了一个错误。这行得通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2017-09-08
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多