2014-12-09 3 views
0

то, что я делаю, звучит очень просто. Измените размер моего GridView, когда SoftKeyboard открыт. Поместите его обратно на место (размер размера), где он принадлежит, если исчезает SoftKeyboard.OnGlobalLayoutListener постоянно срабатывает, если видна SoftKeyboard.

Для этого я сделал следующее:

root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      // TODO Auto-generated method stub 
      if(gv != null && searchbar != null) { 
       root.getWindowVisibleDisplayFrame(r); 
       if(screenHeight > r.bottom) { 
        RelativeLayout.LayoutParams myLayoutParams = (android.widget.RelativeLayout.LayoutParams) gv.getLayoutParams(); 
        myLayoutParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        gv.setLayoutParams(myLayoutParams); 
        int gvHeight = screenHeight - r.bottom - searchbar.getLayoutParams().height; 
        gv.getLayoutParams().height = gvHeight; 
       }else { 
        RelativeLayout.LayoutParams myLayoutParams = (android.widget.RelativeLayout.LayoutParams) gv.getLayoutParams(); 
        myLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        gv.setLayoutParams(myLayoutParams); 
       } 

      } 

     } 
    }); 

Где gv мой GridView. Если я запустил свое приложение и нажал на свою панель поиска, появится softkeyboard, и этот метод все время стреляет. (Даже если макет не меняется или даже я ничего не нажимаю). Поэтому он блокирует мой пользовательский интерфейс. Я сделал что-то не так?

Кроме того, у кого-то есть лучшая идея, реализующая эту функцию. (Изменение размера моей сетки при отображении Softkeyboard и наоборот).

Любая помощь приветствуется.

Уведомление

Работа с onFocusChange звучит не очень хорошо для меня. Потому что на моем устройстве. Я могу закрыть SoftKeyboard с backPress без потери Focus

ответ

0

Вы пробовали использовать View.OnLayoutChangeListener для API 11+ вместо этого?

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

@Override 
public void onGlobalLayout() { 
    int heightDiff = root.getRootView().getHeight() - root.getHeight(); 
    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
      root.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } else { 
      root.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
     ... rest of your code 
    } 
}