Android onBackPressed () не вызывается?
в моей MainActivity, которая простирается от AppCompatActivity, я хочу переопределить метод onBackPressed следующим образом:
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}
но onBackPressed не вызывается. Как бы то ни было, если я не переопределяю onBackPressed, приложение закрывается, когда я нажимаю кнопку backbutton, и если я переопределяю его, это не так.
остальная часть моей деятельности выглядит так:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private Drawer drawer;
private FloatingActionButton fab_test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fab_test = (FloatingActionButton) findViewById(R.id.fab_test);
fab_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"FAB Test pressed",Toast.LENGTH_SHORT).show();
}
});
buildDrawer();
getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,page).commit();
}
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
}
EDIT: я говорю об аппаратной кнопке backbutton (а не actionbar)
5 ответов
этот вопрос уже ответили, но я чувствую, чтобы очистить что-то здесь в этой теме. Большинство комментариев и ответов указывают на использование super.onBackPressed()
и что это является причиной не работает метод onBackPressed()
. Но это не правильно и важно, чтобы другие новички знают. Метод onBackPressed()
не нужно использовать super.onBackPressed()
. onBackPressed()
также работает, если кто-то, например, комментарий super.onBackPressed()
выход.
как написал вопрошающий, он не будет использовать super.onBackPressed()
потому что он закроет деятельность. Итак, причина этого, почему он не работает, может быть разделена на три возможные причины:
- журнал не работает из-за плохого фильтра в консоли logcat
- тост dosnt работает из-за неправильного переданного контекста
- ОС реализована неправильно поставщиком.
обычно тост работает, передавая правильный контекст. В случае с вопрошающим, просто проходя this
.
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show();
}
для журнала просто установите правильный фильтр на logcat.
мне все равно, если кто-то дает downvotes сейчас, но для других новичков должно быть ясно, что super.onBackPressed()
не должны использоваться.
в любом случае, использование onKeyDown()
также является решением.
на onBackPressed()
действие по умолчанию вызывается из onKeyDown()
в API onKeyUp() от уровня API 5 и выше. Если onKeyUp()
не называет super.onKeyUp()
, onBackPressed()
не будет называться.
документация onKeyDown ()
документация onKeyUp ().
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
/*
* without call to super onBackPress() will not be called when
* keyCode == KeyEvent.KEYCODE_BACK
*/
super.onKeyUp(keyCode, event);
}
еще одна причина, что onBackPressed()
может не вызываться, потому что вы используете мягкую кнопку назад на actionbar, в этом случае необходимо следующее:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
ты пропал,супер.onBackPressed();
@Override
public void onBackPressed() {
super.onBackPressed();
}
или вы можете использовать
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
//replaces the default 'Back' button action
if(keyCode==KeyEvent.KEYCODE_BACK) {
// something here
finish();
}
return true;
}
спасибо
использовать super.onBackPressed()
@Override
public void onBackPressed() {
super.onBackPressed();
Log.d("MainActivity","onBackPressed");
Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}