2017-02-21 14 views
2

Что я тестировал:Какое событие срабатывает в андроида, когда клавиатура открыта и жмем BackButton

В Android, когда клавиатура не открывается и жмем кнопку назад. onBackPressed() событие вызывается

Вопрос

СЦЕНАРИЙ-A: В Android при открытии клавиатуры и жмем кнопку назад. Клавиатура закрывается. onBackPressed() не уволили

примечание:первое время onBackPressed() не называется здесь ... Только если клавиатура не видна onBackPressed() называется

Как Programatically имитироватьСЦЕНАРИЙ-A

+0

родственный: http://stackoverflow.com/questions/ 3940127/intercept-back-button-from-soft-keyboard –

+0

проверьте это. он решил ту же проблему, у меня было [https://stackoverflow.com/a/36259261/5130987](https://stackoverflow.com/a/36259261/5130987) –

ответ

0

на BackKeyPress проверить, открыт ли на belowed сниппета Мягкая клавиатура, если он открыт, то закройте его и предотвратить onBackPressed(), если не называть onBackPressed()

final View activityRootView = findViewById(R.id.activityRoot); 
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     Rect r = new Rect(); 
     //r will be populated with the coordinates of your view that area still visible. 
     activityRootView.getWindowVisibleDisplayFrame(r); 

     int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); 
     if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 
      ... close soft keyboard from here 
     } 
    } 
    }); 
0

onBackPressed() не будет вызвана, когда клавиатура и закрывается. Не знаю точной причины, но это факт.

Однако, если вам нужно захватить событие назад, когда отображается клавиатура, вы можете прослушивать изменения в видимости макета корневого/родительского макета.

Подтвердив @ReubenScratton, который дал отличную answer, чтобы преодолеть эту проблему, мы имеем следующий код:

final View activityRootView = findViewById(R.id.activityRoot); 
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); 
     if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard... 
      // ... do something here 
     } 
    } 
}); 

и dpToPx функции:

public static float dpToPx(Context context, float valueInDp) { 
    DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); 
}