2015-09-24 3 views
3

Я разрабатываю приложение для Android, в котором моя mainActivity имеет 5 вкладок внизу, представленных в FrameLayout. Каждая вкладка указывает на определенный фрагмент, который загружается на основе щелчка.android - показать клавиатуру fix bottom framelayout

На моей первой вкладке у меня есть EditText. Когда текст редактирования сфокусирован, мне нужно показать клавиатуру, просто переместив макет («EditText и Send») вверх, не нажимая на другие компоненты, включая макет рамки нижней вкладки. Аналогичным образом, скрывая клавиатуру, макет «EditText и Send btn» должен располагаться над макером рамки табуляции. Может кто-нибудь, пожалуйста, предложите мне решение для этого?

(Предположим, что ситуация такая же, как в комментарии к Facebook. Когда мы заходим в сообщение, чтобы что-то прокомментировать, макет ('Write Comment' ET и POST btn) будет выдвинут без перемещения каких-либо других компонентов, включая нижние вкладки ('News Feed', 'Requests', 'Messenger', 'Notifications', 'More'))

Я не хочу делать макет рамки Visibility.Gone/Visible, поскольку он заканчивается уродливой анимацией, когда клавиатура сдвигается вверх/вниз.

ответ

1

Используйте LinearLayout не йота не weightSum, и дать свой основной вид вашей высоты макета 0dp, а вес 1

+0

Я не мог понять, что вы пытаетесь сказать. Не могли бы вы рассказать о своем ответе? – maanick90

0

У меня точно такой же вопрос. Лучшее обходное решение, которое я мог найти (как указано в первоначальном вопросе), приведен ниже. Но это предельное решение, а не отличное.

Проблема с настройкой weightSum заключается в том, что если прокрутка, содержащая поля редактирования, длиннее, кнопка исчезнет. Лучшее решение позволит кнопкам оставаться в нижней части страницы на обычном изображении, но скрываться во время экранной клавиатуры.

public boolean dispatchTouchEvent(MotionEvent event) { 

    View v = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 

    if (v instanceof EditText) { 
     View w = getCurrentFocus(); 
     int scrcoords[] = new int[2]; 
     w.getLocationOnScreen(scrcoords); 
     float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
     float y = event.getRawY() + w.getTop() - scrcoords[1]; 
     if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom())) { 
      InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0); 
      layButton.setVisibility(View.VISIBLE); 
     } 
     else 
     { 
      layButton.setVisibility(View.GONE); 
     } 
    } 
    return ret; 
}