2013-09-20 3 views
0

Мне нужно реализовать скользящее меню в моем приложении. Пользователь должен уметь показывать/скрывать его, нажав на него и перемещая влево/вправо.Обновление пользовательского вида макета позиции

Для реализации этого I`ve создал обычай SlidableFrameLayout, который расширяет FrameLayout. Переопределелив onTouchEvent метод рассчитать положение скольжения и вызвать

private void setLeftLayout(int left) { 
    layout(left, getTop(), getRight(), getBottom()); 
} 

изменить положение для SlidableFrameLayout. Все работает нормально, но когда я открываю клавиатуру (после фокусировки EditText), SlidableFrameLayout изменяет свое значение слева на 0, поэтому, если меню закрыто, оно открывается. То же самое происходит, когда я скрываю клавиатуру (как правило, она появляется во всех действиях, которые, как мне кажется, не позволяют вызвать методы макета).

Не могу придумать, как это исправить. Не могли бы вы помочь мне? Если какая-либо дополнительная информация требуется, я приложу ее. Спасибо

ответ

0

В результате, я изменил свою логику:

private void setLeftLayout(int left) { 
    FrameLayout.LayoutParams params = getFrameLayoutParams(); 
    params.leftMargin = left; 
    params.rightMargin = -left; 
    requestLayout(); 
} 

В моем случае, точка зрения является родителем FrameLayout, поэтому я добавил `t гавани условия в 1-й строке методы. Этот метод работает очень хорошо.

1

Я думаю, что ваша проблема связана с вызовом макета напрямую. Когда вид контейнера меняет размер в результате отображения/скрытия клавиатуры onMeasure/onLayout, вызывается с границами по умолчанию для представления. В вашем случае я предполагаю, что левая граница равна 0, поэтому макет вызывается с 0 для каждого раза при каждом изменении размера окна. Вместо этого вы, вероятно, хотите использовать что-то вроде setTranslationX или scrollTo ..

Удачи!

+0

Спасибо, я попробовал это с scrollTo, но это не совсем то, что мне нужно. Я попытаюсь использовать setTranslationX и уведомлять о результатах. – UneXp

Смежные вопросы