Java 应用正确的活动生命周期方法
更新 这是我的listview应用程序: 我单击电子邮件选项,该选项启动意图并加载我的电子邮件活动: 如果用户单击“上一步”,则listview为空: 这是我设置listview的方法:Java 应用正确的活动生命周期方法,java,android,Java,Android,更新 这是我的listview应用程序: 我单击电子邮件选项,该选项启动意图并加载我的电子邮件活动: 如果用户单击“上一步”,则listview为空: 这是我设置listview的方法: public class view extends ListActivity { ImageButton searchButton; EditText searchName; ListView searchedListResults; long idToPass; String numRetur
public class view extends ListActivity {
ImageButton searchButton;
EditText searchName;
ListView searchedListResults;
long idToPass;
String numReturned;
String email;
SimpleCursorAdapter cursorAdapter;
DBHandler getCons;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
searchedListResults = (ListView) findViewById(android.R.id.list);
list();
searchName = (EditText) findViewById(R.id.inputName);
searchedListResults.setTextFilterEnabled(true);
searchName.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
cursorAdapter.getFilter().filter(s.toString());
searchedListResults.refreshDrawableState();
}
});
getCons = new DBHandler(this, null, null);
cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
getCons.open();
return getCons.getChanges(constraint.toString());
}
});
searchedListResults.setAdapter(cursorAdapter);
}
private void list() {
DBHandler DBsearchRef = new DBHandler(this, null, null);
DBHandler search = new DBHandler(this, null, null);
search.open();
Cursor cursor = search.getData();
search.close();
startManagingCursor(cursor);
String[] from = new String[] { DBsearchRef.KEY_NAME,
DBsearchRef.KEY_TEL, DBsearchRef.KEY_EMAIL,
DBsearchRef.KEY_COMMENTS };
int[] to = new int[] { R.id.txtNameSet, R.id.txtContactSet,
R.id.txtEmailSet, R.id.txtCommentSet };
cursorAdapter = new SimpleCursorAdapter(this, R.layout.searchagain,
cursor, from, to);
searchedListResults.setAdapter(cursorAdapter);
}
@Override
protected void onResume() {
super.onResume();
list();
searchName = (EditText) findViewById(R.id.inputName);
searchedListResults.setTextFilterEnabled(true);
searchName.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
cursorAdapter.getFilter().filter(s.toString());
searchedListResults.refreshDrawableState();
}
});
getCons = new DBHandler(this, null, null);
cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
getCons.open();
return getCons.getChanges(constraint.toString());
}
});
searchedListResults.setAdapter(cursorAdapter);
}
@Override
public void onListItemClick(ListView list, View v, int list_posistion,
long item_id) {
idToPass = item_id;
idToPass = item_id;
DBHandler num = new DBHandler(this, null, null);
num.open();
numReturned = num.getNum(idToPass);
email = num.getEmail(idToPass);
num.close();
final CharSequence[] items = { "Call Contact", "Email Contact",
"Edit Contact", "Add Appointment" };
Builder alertDialogBuilder = new AlertDialog.Builder(view.this);
alertDialogBuilder.setTitle("Contact Options:");
alertDialogBuilder.setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals("Call Contact")) {
Intent makeCall = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:" + numReturned));
startActivity(makeCall);
}
else if (items[item].equals("Email Contact")) {
Intent emailIntent = new Intent(
"com.example.flybaseapp.ContactsEmail");
emailIntent.putExtra("passedEmailAdd", email);
startActivity(emailIntent);
} else if (items[item].equals("Edit Contact")) {
Intent Edit = new Intent(
"com.example.flybaseapp.viewEdit");
Edit.putExtra("passedID", idToPass);
startActivity(Edit);
}
else if (items[item].equals("Add Appointment")) {
Intent conAdd = new Intent(
"com.example.flybaseapp.AddAppointmentContact");
conAdd.putExtra("newpassedID", idToPass);
startActivity(conAdd);
}
}
});
alertDialogBuilder.show();
}
是否在覆盖的onResume方法中设置此选项?Android活动生命周期可在此处找到: 活动已经为您的活动实施了所有阶段。除了需要自己定义的onCreate()之外 如果需要在生命周期的其他阶段执行特定的操作,则只调用这些阶段 让我们以LoginActivity为例
您创建这样的活动(我知道……这里没有什么新内容):
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
@Override
public void onPause() {
super.onPause();
SavedValues.setLoginUser(usr.getText().toString());
SavedValues.setLoginPassword(pass.getText().toString());
justCreated = false;
}
现在,让我们假设登录已成功验证,并且该活动已进入其短暂但紧张的生命周期的下一步。这将是暂停()阶段。这意味着活动将处于“后台”
用户设置为用户名和密码的字符串会发生什么变化?。。嗯,如果您不将它们保存在某个地方,那么如果用户导航回登录屏幕,它们就会丢失(这意味着活动将被重新创建)
在这种情况下,您需要@Override onPause()方法,并对这些字符串执行一些操作。为了简单起见,我将使用一个名为SavedValues的创建的公共类来保存这些字符串
savedValue类:
public class SavedValues {
private static String loginUser = "";
private static String loginPassword = "";
public static String getLoginUser() {
return loginUser;
}
public static void setLoginUser(String loginUser) {
SavedValues.loginUser = loginUser;
}
public static String getLoginPassword() {
return loginPassword;
}
public static void setLoginPassword(String loginPassword) {
SavedValues.loginPassword = loginPassword;
}
}
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
@Override
public void onPause() {
super.onPause();
SavedValues.setLoginUser(usr.getText().toString());
SavedValues.setLoginPassword(pass.getText().toString());
justCreated = false;
}
@Override
public void onResume() {
super.onResume();
if (justCreated == true) //if the user recreated the activity, restore the login values from the previous instance
{
usr.setText(SavedValues.getLoginUser(), TextView.BufferType.EDITABLE);
pass.setText(SavedValues.getLoginPassword(), TextView.BufferType.EDITABLE);
usr.setSelection(usr.getText().length());
}
else //if the user only left the activity clear the login values
{
usr.setText("", TextView.BufferType.EDITABLE);
pass.setText("", TextView.BufferType.EDITABLE);
}
}
现在。。。活动中包含的onPause()方法:
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
@Override
public void onPause() {
super.onPause();
SavedValues.setLoginUser(usr.getText().toString());
SavedValues.setLoginPassword(pass.getText().toString());
justCreated = false;
}
到目前为止,一切都很好。现在,当用户导航回LoginActivity时,它将进入其生命周期的onResume()阶段。如果我们对此不采取任何措施,则不会设置保存的值
因此,我们将重写onResume()方法,以便在LoginActivity从睡眠中醒来时检索这些值:
public class SavedValues {
private static String loginUser = "";
private static String loginPassword = "";
public static String getLoginUser() {
return loginUser;
}
public static void setLoginUser(String loginUser) {
SavedValues.loginUser = loginUser;
}
public static String getLoginPassword() {
return loginPassword;
}
public static void setLoginPassword(String loginPassword) {
SavedValues.loginPassword = loginPassword;
}
}
public class LoginActivity extends Activity {
public EditText usr;
public EditText pass;
final Context context = this;
private TextView loginButton;
private Boolean justCreated = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
initLoginButton();
initEditTexts();
addSwipeGesture();
justCreated = true;
}
@Override
public void onPause() {
super.onPause();
SavedValues.setLoginUser(usr.getText().toString());
SavedValues.setLoginPassword(pass.getText().toString());
justCreated = false;
}
@Override
public void onResume() {
super.onResume();
if (justCreated == true) //if the user recreated the activity, restore the login values from the previous instance
{
usr.setText(SavedValues.getLoginUser(), TextView.BufferType.EDITABLE);
pass.setText(SavedValues.getLoginPassword(), TextView.BufferType.EDITABLE);
usr.setSelection(usr.getText().length());
}
else //if the user only left the activity clear the login values
{
usr.setText("", TextView.BufferType.EDITABLE);
pass.setText("", TextView.BufferType.EDITABLE);
}
}
因此,这就是您将如何利用活动生命周期中的某些阶段来获得优势。当然,还有更多,但我认为这应该让你开始。请阅读更多有关该网站的信息。他们有一个像样的文档,尽管以一种令人困惑的方式是非线性的
更新 要回答您的最新问题,请执行以下操作: 您可以使用我的SavedValues示例,并在其中输入如下内容:
private static ArrayList<Custom> yourList;
public static ArrayList<Custom> getyourList() {
return yourList;
}
public static void setyourList(ArrayList<Custom> yourList) {
SavedValues.yourList = yourList;
}
现在,如果您按下后退按钮并返回到您的活动,数据应该在那里
我使用了一种几乎相同的方法,即使用从Oracle DB填充的阵列适配器。工作起来很有魅力
干杯,祝你好运 将在适当的时候运行必要的方法,即使它们没有写入您的代码中
onCreate()
是唯一一个使您覆盖
所必需的。所有其他操作将根据您的活动所处的状态运行。但是,如果需要,您可以覆盖这些方法中的任何一种或所有方法
例如,由于onResume()
在每次活动
可见时运行,而onCreate()
仅在首次创建活动
时运行,因此您可以选择将代码放入onResume()
中,以确保每次活动
可见时都运行。或者,您可能希望在销毁活动时保存一个变量
@Override
public void finish()
{
super.finish();
// save variable to sharedprefs or wherever here
}
我不明白你想知道什么。唯一需要实现的Activity
方法是onCreate()
。你不需要实现其他的,除非你需要/想要在他们身上做一些特别的事情,在这种情况下,没有更多的细节我们无法告诉你。如果它工作,那么我看不出任何问题,除了你说你需要关闭你的电脑cursors@codeMagic在这段代码中,我有很多功能,比如过滤和编辑listview中的信息,加载新的意图(比如编辑页面),据我所知,我需要覆盖onPause()等方法如果发生这种情况,那么重新启动时onResume()会吗?否,系统将根据在必要时重写这些方法,但如果您需要额外的功能,则可以重写这些方法,例如在活动
恢复时执行一些额外操作,然后您可以重写onResume()
并执行所需操作there@codeMagic这些方法是否在活动代码中“自动”完成?我没有意识到这是事实。我添加了一个答案,可能会让你更清楚一点。如果没有,请询问。是的,它们将自动运行,这是有意义的。我永远也弄不明白为什么他们需要被控制住,因为它看起来应该是自动关闭的……所以看起来我的理解是正确的。为你的移植做了很多准备。看起来这只是一个例子,我以错误的方式关闭了我的光标,这是给我的错误。我还收到fillwindows()错误中的游标无效语句。这似乎又是一个光标错误?我很高兴能帮你澄清。是的,这听起来像是一个光标问题。如果你不能缩小范围,就用相关的DB代码创建一篇帖子,只是为了添加我已经设法解决了这些光标问题并安装了我的应用程序。当我点击回我的listview页面时,我的listview是空白的。我更新了我的问题来强调这一点。我假设这就是我需要超越onResums()来重新显示我的列表视图的地方。我不确定你有什么,因为没有看到那么多的代码,但是你可能需要在onResume()
中调用notifyDataSetChanged()
。返回时是否验证了适配器是否有值?如果您没有使用列表调用Activity
上的finish()