2016-09-16 3 views
2

в моем MainActivity, который простирается от AppCompatActivity, я хочу, чтобы переопределить onBackPressed метод следующим образом:Android onBackPressed() не называется?

@Override 
public void onBackPressed() { 
    Log.d("MainActivity","onBackPressed"); 
    Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show(); 
} 

но onBackPressed не дозвонились. Как бы то ни было, если я не переопределяю onBackPressed, приложение закрывается, когда я нажимаю на него, и если я его переопределяю, это не так.

Остальная часть моей деятельности выглядит следующим образом:

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 один)

+2

использовать onKeyDown метод, чтобы переопределить обратное действие – siddhesh

+0

... вы можете легко поместить этот код внутри 'onBackPressed()', не нужно 'onKeyDown'. Из документов: «Вызывается, когда активность обнаруживает нажатие на клавишу пользователя. Реализация по умолчанию просто завершает текущую активность, но вы можете переопределить ее, чтобы делать все, что хотите. «Для этого поведения должна быть какая-то другая проблема. – Opiatefuchs

+0

@Steve: У вас есть чрезмерная кнопка 'onKeyDown' для возврата? Потому что, если вы сделали это где-нибудь в своем коде, возможно, вы не вернули true и 'onBackPressed' не вызывается .... – Opiatefuchs

ответ

5

Этот вопрос уже ответил, но я чувствую, чтобы очистить что-то здесь, в этой теме. Большинство комментариев и ответов указывают на использование super.onBackPressed() и что это является причиной неработающего метода onBackPressed(). Но это неверно и важно, чтобы другие новички знали. Метод onBackPressed() не должен использовать super.onBackPressed(). onBackPressed() также работает если кто-то, к примеру, комментарий super.onBackPressed() вне.

Как писал опросник, он не будет использовать super.onBackPressed(), потому что он закроет деятельность. Таким образом, причина этого, почему это не правда работы, может быть отделена на три возможные причины:

  1. Журнал работы это не распространяется из-за неправильный фильтр в консоли LogCat
  2. тоста dosn't работа из-за неправильного прошедшего контекста
  3. ОС реализована неправильно поставщиком.

Как правило, тост работает, передавая правильный контекст. В случае опроса просто пройдите this.

@Override 
public void onBackPressed() { 
    Log.d("MainActivity","onBackPressed"); 
    Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show(); 
} 

Для журнала просто установите правильный фильтр для логарифма.

Мне небезразлично, если кто-то сейчас дает вниз, но для других начинающих должно быть ясно, что super.onBackPressed() не должен использоваться.

В любом случае, использование onKeyDown() также является решением проблемы.

-1

использования super.onBackPressed()

@Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     Log.d("MainActivity","onBackPressed"); 
     Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show(); 
} 
0

Вам не хватает, super.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; 
} 

благодаря

+0

, как он заявил, и это правильно, super.onBackPressed() закроет действие. Вы можете легко переопределить это и прокомментировать это, метод будет работать без super.OnBackPressed() – Opiatefuchs

+0

super.onBackPressed(); ничего не делал, но по какой-то причине KeyDown работал на меня. – Steve2955

+0

наверняка, 'onKeyDown' будет работать, просто попробуйте мое решение в комментарии с передачей правильного контекста .... onBackPressed должен работать ... – Opiatefuchs

2

onBackPressed() действие по умолчанию вызывается из onKeyDown() в API < 5 и действие по умолчанию вызывается из 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; 
    } 
} 
0

Просто Удалить super.onBackPressed () будет работать