sca*_*and 5 android android-intent extra android-activity
所以我有一个奇怪的问题.我正在进行2项活动.其中一个活动显示一个ListView,其数据通过一个很长的Extra来获取,我用它来通过database.query中的WHERE子句获取结果.单击ListView项时会调用另一个Activity,允许某人向ListView的数据库添加内容.
活动名称是DaysActivity.java(列表视图DayAddActivity.java的活动)和(允许某人添加一天的活动,然后显示在DaysActivity.javaListView中).
我遇到的问题是,当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();
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
cancelDay()单击"取消"按钮时会调用该函数activity_day_add.xml.就像我说的,当我点击里面的"取消"按钮时DayAddActivity.java,它会返回到DaysActivity.javaListView就可以了.所有数据都在那里.但是,如果我按下操作栏中的后退按钮(包含后面箭头的按钮和活动标题旁边的应用程序图标),ListView for DaysActivity.java为空/消失,标题也为空(因为这也是生成的)通过Extra String值).
您的游标不受活动管理,这可能会导致内存泄漏甚至 ANR。您应该考虑使用加载器来使用游标填充列表。您可以在这里找到一个示例:http://developer.android.com/guide/components/loaders.html。
加载器工作得更好,因为在获得与数据库的连接时它们不会冻结应用程序,并且它们将从活动的一个实例传递到另一个实例,从而防止内存泄漏和重用资源。
但同样,正如您在上一篇文章中所说:额外内容似乎在 onResume() 中丢失,您应该了解 onSaveInstanceState 和 onCreate 之间的链接,以将参数传递给活动的未来自身。看这个帖子,得分最高的答案是:onSaveInstanceState()和onRestoreInstanceState()。
| 归档时间: |
|
| 查看次数: |
5504 次 |
| 最近记录: |