在Android编程中,硬件后退按钮和导航栏中的后退按钮之间有区别。在我的应用程序中,有一个视图,如果单击硬件后退按钮,该应用程序将崩溃。但是,如果我单击导航栏中的按钮,则效果很好。是否基于两种不同类型的按钮(例如oncreate和onresume)调用不同的方法。
我从以下类别调用后退按钮:
public class ViewContact extends ActionBarActivity {
Button btnDelete;
TextView name;
TextView position;
TextView email;
TextView phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_contact);
getActionBar().setDisplayHomeAsUpEnabled(true);
name = (TextView)findViewById(R.id.contactName);
position = (TextView)findViewById(R.id.contactPosition);
email = (TextView)findViewById(R.id.contactEmail);
phone = (TextView)findViewById(R.id.contactPhone);
btnDelete = (Button)findViewById(R.id.deleteContactBtn);
Bundle takeBundledData = getIntent().getExtras();
final String contactName = takeBundledData.getString("clickedName");
String contactPosition = takeBundledData.getString("clickedPosition");
String contactEmail = takeBundledData.getString("clickedEmail");
String contactPhone = takeBundledData.getString("clickedPhone");
name.setText(contactName);
position.setText(contactPosition);
email.setText(contactEmail);
phone.setText(contactPhone);
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MySQLiteHelper androidOpenDbHelper = new MySQLiteHelper(getApplicationContext());
SQLiteDatabase sqliteDatabase = androidOpenDbHelper.getWritableDatabase();
String[] whereClauseArgument = new String[1];
whereClauseArgument[0] = contactName;
// Only difference between UPDATE and DELETE is
//DELETE does not have ContentValues part
sqliteDatabase.delete(MySQLiteHelper.TABLE_NAME_WIL, MySQLiteHelper.COLUMN_NAME_NAME + "=?", whereClauseArgument);
sqliteDatabase.close();
finishActivity(0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.view_contact, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Logcat错误:
java.lang.RuntimeException: Unable to resume activity: java.lang.IllegalStateException: trying to requery an already closed cursor android.database.sqlite.SQLiteCursor@43cfb6f0
Run Code Online (Sandbox Code Playgroud)
除了错误(这是一个不同的问题)之外,为什么它仅在硬件后退而不是导航栏后退按钮的情况下发生
当您按下“硬件后退按钮”或“提供的软后退按钮”时,它将触发“活动”中的onBackPressed()方法。您可以根据需要覆盖此行为。
与导航栏“后退按钮”的不同之处在于,您必须像对待“ android.R.id.home”案例中的onOptionsItemSelected()方法那样,自行处理。
您遇到的问题可能是因为“先前”活动滥用了“游标”。当您按回“ ViewContact”时,它将完成“ ViewContact”活动,并且上一个活动的onResume()将再次被调用。因此,发生这种情况时,显然您先前的活动正在尝试重用封闭的游标,然后发生错误。在您的NavUtils.navigateUpFromSameTask(this)上,您可能正在阻止这种情况的发生。但是我描述的是OFFICEIAL和DEFAULT行为。
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |