Android поля не работают, когда представление было добавлено динамически - PullRequest
0 голосов
/ 04 февраля 2020

Я добавляю некоторое представление в LinearLayout динамически:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(100, 100, 100, 100);
view.setLayoutParams(params);
parent.addView(view);

Однако поля не применяются. Следующее:

view.invalidate();
view.requestLayout();
parent.invalidate();
parent.requestLayout();

не работает. Тем не менее, если я заставляю упражнение воссоздать (например, выключить и включить мобильный телефон), поля будут применены. Вызов activity.recreate () также работает, но он слишком медленный.

Как заставить макет пересчитывать поля? Возможно, что-то не так в потоке? Я пытался добавить свои представления в root после создания, добавить детей до и после применения свойств, но у меня это не сработало.

UPD: Я пытался повторить ошибка программно и получена с этим кодом:

LinearLayout base = new LinearLayout(context);
LayoutParams params1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
base.setLayoutParams(params1);    
base.setBackgroundColor(Color.CYAN);
root.addView(base);

LinearLayout another1 = new LinearLayout(context);
LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
another1.setLayoutParams(params2);
another1.setOrientation(LinearLayout.VERTICAL);
another1.setBackgroundColor(Color.BLUE);
base.addView(another1);

TextView tv1 = new TextView(context);
tv1.setText("SOME TEST TEXT 1");
tv1.setTextColor(Color.BLACK);
LayoutParams params4 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv1.setLayoutParams(params4);
another1.addView(tv1);

TextView tv2 = new TextView(context);
tv2.setText("SOME TEST TEXT 2");
tv2.setTextColor(Color.BLACK);
LayoutParams params5 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params4.setMargins(100, 100, 100, 100);
tv2.setLayoutParams(params5);
another1.addView(tv2);

Here's what I got

Я ожидаю, что поля будут применены, но это не так. Каков правильный порядок инициализации такого представления?

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Итак, моя проблема была в преобразователе DP в PX, который просто не был инициализирован в тот момент. Однако, чтобы прояснить все, мой пример выше - просто ошибка (я не менял params4 на params5 при добавлении второго TextView. Также во время тестирования всего я обнаружил, что порядок добавления макетов и их параметров не имеет значения при все.

1 голос
/ 04 февраля 2020

Возможно, вы добавили дочерние представления в родительское представление в onCreate ().

В onCreate () родительское представление не имеет фактического размера.

Если вам нужно сделать это в onCreate (), попробуйте следующий код.

    final ViewTreeObserver observer = parent.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            LinearLayout.LayoutParams params = new
                    LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            params.setMargins(100, 100, 100, 100);
            TextView view = new TextView(context);
            view.setLayoutParams(params);
            parent.addView(view);
            observer.removeOnGlobalLayoutListener(this);
        }
    };

Надеюсь, это поможет!

0 голосов
/ 05 февраля 2020

Попробуйте:

      LinearLayout ll = findViewById(R.id.linearLayout);
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT,
      LinearLayout.LayoutParams.WRAP_CONTENT);
      layoutParams.setMargins(30,20,30,0);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...