2016-05-14 3 views
0

У меня есть конструкция, где есть вход EditText с набором опций для блоков ввода (RadioGroup, полный RadioButtons). Когда пользователь выбирает определенную опцию, я применил ViewGroup.LayoutParams для настройки ширины до требуемого значения.Курсор в неправильном положении при изменении размера EditText с animateLayoutChanges

Все отлично работает нормально, но когда я добавляю animateLayoutChanges, чтобы улучшить внешний вид, курсор в EditView отрицательно сказывается:

  • пользователь вводит значение, все кажется нормальным (тяжести находится прямо в EditText кстати)
  • Проверяется опция, сжимающая вид, - анимированные представления видят, что усугубляется - НО - запись теперь скрыта из виду! Спрятано там, где должно было быть. Если вы щелкнете по полю или измените опцию RadioButton на один с одним и тем же размером ввода, запись затем переместится в соответствующее положение ...
  • Аналогично - вид небольшой и имеет позицию в правильном положении, вариант где выбрано расширение вида - теперь представление расширяется, и запись остается в центре представления вместо перехода в правильное положение! Опять же освежает, когда выполняется другое действие в отношении EditText ..

Я попытался исправить это:

  • Сохранение строки ввода во временную переменную и заменить его setText()
  • Использование append("") ничего не добавлять перед повторным добавлением строки
  • Calling .requestFocus() в EditText при выборе
  • Перерисовка вид с .invalidate()
  • Установка курсора в конец зрения
  • Попытка заказные набор анимаций (без успеха, я, возможно, придется продолжать с этим подходом?)

Если кто-нибудь знает как я могу потенциально обновить представление, чтобы он обновлял текстовую позицию или иным образом отключил анимацию только на этом представлении, оставив все остальные, что было бы здорово!

Спасибо!

+0

Можете ли вы предоставить свой примерный код, чтобы понять, что вы пытаетесь пытаться и не работаете? – mqpasta

+0

Привет, конечно, я могу, но я не вижу, как это поможет - ни один из вышеперечисленных методов не обновляет представление так, что он меняет положение курсора. Мне просто нужен способ обновить его после окончания анимации animateLayoutChanges. Я попытался настроить его, чтобы проверить конец анимации программным способом, но в нем используется layouttransition, а не анимация. Есть ли что-то в вопросе, которое вы не понимаете? – Michal

ответ

0

Я закончил разработку решения в конце концов ..! Вот он для тех, кто может быть в подобной ситуации. Я установил animateLayoutChanges в ложные и пользовательские анимированные другие переходы - в моем случае это был TextViews рядом с EditText, которые появлялись и исчезали по мере изменения размера. Мне пришлось использовать метод .animate(). Alpha (float), как показано ниже.

Для становится видимым:

textViewFractionIn.setVisibility(View.VISIBLE); 
textViewFractionIn.animate() 
    .alpha(1.0f) 
    .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      // Has to be blank it seems to override the previous .setListener in the GONE case? 
      } 
     }); 

И сделать его невидимым (GONE в данном случае):

textViewFractionIn.animate() 
    .alpha(0.0f) 
    .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      textViewFractionIn.setVisibility(View.GONE); 
      } 
     }); 

Это одушевляет замирание взглядов как по умолчанию, но любые движения взглядов остаются дискретными, и поэтому курсор EditText остается в нужном месте!

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