硬件后退按钮和导航栏后退按钮之间的区别

ajk*_*550 4 android

在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)

除了错误(这是一个不同的问题)之外,为什么它仅在硬件后退而不是导航栏后退按钮的情况下发生

Alé*_*lho 5

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

与导航栏“后退按钮”的不同之处在于,您必须像对待“ android.R.id.home”案例中的onOptionsItemSelected()方法那样,自行处理。

您遇到的问题可能是因为“先前”活动滥用了“游标”。当您按回“ ViewContact”时,它将完成“ ViewContact”活动,并且上一个活动的onResume()将再次被调用。因此,发生这种情况时,显然您先前的活动正在尝试重用封闭的游标,然后发生错误。在您的NavUtils.navigateUpFromSameTask(this)上,您可能正在阻止这种情况的发生。但是我描述的是OFFICEIAL和DEFAULT行为。