在Android编程中,导航栏中的硬件后退按钮和后退按钮之间是否存在差异。在我的应用程序中,有一个视图,如果我单击硬件后退按钮,应用程序崩溃。但是,如果我单击导航栏中的按钮,它可以正常工作。是否根据两种不同类型的按钮调用了不同的方法(例如oncreate vs onresume)。
Class I从后面调用后退按钮:
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);
}
}
}
Logcat错误:
java.lang.RuntimeException: Unable to resume activity: java.lang.IllegalStateException: trying to requery an already closed cursor android.database.sqlite.SQLiteCursor@43cfb6f0
除了错误虽然是一个不同的问题,为什么它只发生在硬件背面而不是导航栏后退按钮
答案 0 :(得分:4)
当您按下“硬件后退”按钮时,或者提供的软后退按钮'它将触发Activity中的onBackPressed()方法。您可以根据需要覆盖此行为。
它与导航栏的区别'后退按钮'就像你在' android.R.id.home'上的 onOptionsItemSelected()方法一样,你必须自己处理这个问题。情况下。
您遇到的问题可能是因为之前的问题。活动滥用了光标'。当您按下' ViewContact'时,它将完成' ViewContact'活动和之前活动的 onResume()将再次被调用。因此,当发生这种情况时,显然您之前的活动正在尝试重用已关闭的游标,然后发生错误。在您的 NavUtils.navigateUpFromSameTask(this)上,您可能正在阻止这种情况发生。但是OFFICIAL和DEFAULT行为是我所描述的行为。
答案 1 :(得分:0)
一个更重要的区别。如果您在活动的父级活动中使用 导航栏后退按钮 返回,则会调用 onNewIntent 方法。 与 硬件后退按钮 不同。