价值观在以前失去活性时,我打后退按钮,而不是在this.finish()被调用(Values los

2019-07-17 14:09发布

所以,我有一个奇怪的问题。 我有2个活动我的工作。 其中一个活动显示一个ListView其数据通过长Extra是抓住我通过使用在database.query WHERE子句来获取结果。 在单击ListView项时,其他活动被调用,允许某人的东西添加到数据库中为ListView。

活动名称是DaysActivity.java (使用ListView活动)和DayAddActivity.java (即允许某人增加1天,然后在显示了活动DaysActivity.java ListView控件)。

我遇到的问题是,当我finish() DayAddActivity.java它可以追溯到DaysActivity和ListView控件仍然存在完全填充。 但是,如果我在打后退按钮DayAddActivity.java (按钮,在我的应用程序图标的操作栏标题的左边),当它返回到DaysActivity.java,ListView控件是空的/没有了。

下面有两个代码:

DaysActivity.java:

package com.gauvion.gfit;

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
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", 0);
        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();
    }

} 

DayAddActivity.java:

package com.gauvion.gfit;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class DayAddActivity extends Activity {
    private RoutinesDataSource datasource;
    private EditText dayName;
    private Spinner dayDay;
    private Button saveButton;
    private long routineDataID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_day_add);
        routineDataID = getIntent().getLongExtra("routineDataID", 0);
    }

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

    public void cancelDay(View view) {
        this.finish();
    }

}

cancelDay()时点击了“取消”按钮功能被称为activity_day_add.xml 。 就像我说的,当我点击里面的“取消”按钮DayAddActivity.java ,它可以追溯到DaysActivity.java和ListView控件是罚款。 所有的数据是存在的。 但是,如果我按在操作栏中的后退按钮为ListView(含后退箭头和活动的标题旁我的应用程序图标的按钮) DaysActivity.java是空的/没了,标题也是空的(因为这还通过一个额外的字符串值生成)。

Answer 1:

您的游标不会由活动管理,这可能会导致内存泄漏,甚至ANR。 你应该考虑使用加载器来填充使用游标的列表。 您可以在这里找到一个例子: http://developer.android.com/guide/components/loaders.html 。

装载机工作更好,因为当获得了连接到数据库,他们不冻结的应用程序,他们会从你的活动的一个实例传递到另一个,防止内存泄漏和再利用的资源。

但同样,在你以前的帖子: 附加功能似乎丢失的onResume() ,你应该明白与的onSaveInstanceState之间的onCreate链接参数传递给您的活动的未来的自己。 看看这个帖子,得到的答案与评分最大: 的onSaveInstanceState()和onRestoreInstanceState() 。



Answer 2:

好像你的背景有一些问题“this.startActivity(startDayAdd);” 线。 尝试使用 “DaysActivity.this.startActivity(startDayAdd);”。 如果它不列入工作,然后使用断点逐行执行看行。



文章来源: Values lost in previous Activity when I hit back button, but not when this.finish() is called