硬件后退按钮和导航栏后退按钮之间的差异

时间:2014-08-08 13:26:09

标签: android

在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

除了错误虽然是一个不同的问题,为什么它只发生在硬件背面而不是导航栏后退按钮

2 个答案:

答案 0 :(得分:4)

当您按下“硬件后退”按钮时,或者提供的软后退按钮'它将触发Activity中的onBackPressed()方法。您可以根据需要覆盖此行为。

它与导航栏的区别'后退按钮'就像你在' android.R.id.home'上的 onOptionsItemSelected()方法一样,你必须自己处理这个问题。情况下。

您遇到的问题可能是因为之前的问题。活动滥用了光标'。当您按下' ViewContact'时,它将完成' ViewContact'活动和之前活动的 onResume()将再次被调用。因此,当发生这种情况时,显然您之前的活动正在尝试重用已关闭的游标,然后发生错误。在您的 NavUtils.navigateUpFromSameTask(this)上,您可能正在阻止这种情况发生。但是OFFICIAL和DEFAULT行为是我所描述的行为。

答案 1 :(得分:0)

一个更重要的区别。如果您在活动的父级活动中使用 导航栏后退按钮 返回,则会调用 onNewIntent 方法。 与 硬件后退按钮 不同。