Перенос textView из одного LinearLayout в другой

188
26 июля 2018, 00:20

У меня есть два LinearLayout в которых есть несколько textView, первое поле имеет определённый размер. Есть ли возможность по заполнению первого поля, переносить textView во второе поле?

UPD: На основе предложенного варианта реализовал такой метод:

public void changeParent(TextView tv){
    FrameLayout flCoverBook = findViewById(R.id.flCoverBook);
    LinearLayout llTextView1 = findViewById(R.id.llTextView1);
    if (llTextView1.getHeight() <= flCoverBook.getHeight()) {
        ((LinearLayout) tv.getParent()).removeView(tv);
        ((LinearLayout) findViewById(R.id.llTextView1)).addView(tv); 
        contentFrameLayout.invalidate(); 
    }
}

Но при использовании он не отработал так необходимо, так как после добавления textView в поле (layout) размер поля оставался прежним, пробовал обновлять его разными методами:

llTextView1.removeAllViews();
llTextView1.requestLayout();
llTextView1.invalidate();
contentFrameLayout.invalidate()l;
lTextView1.refreshDrawableState();

Даже прибегал к достаточно специфичным:

lTextView1.setVisibility(View.GONE);
lTextView1.setVisibility(View.VISIBLE);
lTextView1.removeAllViews();
lTextView1.refreshDrawableState();

и т.д.

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

Заполнение полей выполняется по callback-у и экран обновляется методом:

contentFrameLayout.invalidate(); 

После всех этих манипуляций у меня сложилось впечатление, что с элементами на экране можно работать только после его заполнения и визуализации, а не в момент заполнения.

Answer 1

Если я правильно понял ваш вопрос: напишите функцию, которая будет вызываться каждый раз при изменении текста в TextView:

void changeParent(TextView tv){
        if (tv.getText().length()>limit) {
        //или
        if (tv.getHeight()>img.getHeight()) {
            ((LinearLayout) tv.getParent()).removeView(tv);
            ((LinearLayout) findViewById(R.id.secondLL)).addView(tv);
        }
}

И передавайте туда ваш TextView.

((LinearLayout) tv.getParent()) и ((LinearLayout) findViewById(R.id.secondLL)) можно определить в переменные заранее.

Либо, напишите кастомный TextView, в котором на setText(...) эта функция будет вызываться через interface.

READ ALSO
Запуск/остановка на конкретную дату

Запуск/остановка на конкретную дату

День добрыйВозникла необходимость создания планировщика заданий

196
Mockito тестирование

Mockito тестирование

Тестирую метод 1В методе 1 есть статический вызов метода 2 на объекте другого класса

177
AndroidStudio unit tests

AndroidStudio unit tests

Как протестировать работу кнопок с помощью Espresso,когда они создаются программно и их не запустить с помощью resource idC помощью classname так же не проверить...

199
ArrayDeque, работает не так как ожидаю

ArrayDeque, работает не так как ожидаю

Проблемы с пониманием работы ArrayDeque, а именно с заданием размерности

179