addRule в RelativeLayout.LayoutParams не работает - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть этот код:

final RelativeLayout headerRl=new RelativeLayout(SpeakersActivity.this);
            headerRl.setBackgroundColor(Color.parseColor(almacen.getColor()));
            final TextView initial=new TextView(SpeakersActivity.this);
            final RelativeLayout.LayoutParams headerParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80);
            headerParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
            initial.setText(arrayInitials.get(i));
            initial.setTextColor(getColor(R.color.white));
            initial.setTextSize(16);
            initial.setPadding(10,0,0,0);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    headerRl.addView(initial,headerParams);
                    ll.addView(headerRl);
                }
            });

"ll" - это LinearLayout. Я добавляю правило для RelativeLayout.LayoutParams, я добавляю представление в RelativeLayout, который добавляется в LinearLayout. Но мой взгляд не центрирован по вертикали. Я попытался отцентрировать его по горизонтали, чтобы увидеть, работает ли оно, но это не так. Почему мой взгляд не сосредоточен в ЛР? Как это отцентрировать?

Спасибо.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

В зависимости от ожидаемого результата Есть 2 способа решения вашей проблемы.

Первый: проблема в headerRl, который по умолчанию установлен как wrap_content, wrap_content. Итак, что вам нужно?чтобы определить его параметры макета с помощью match_parent:

headerRlLayoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 
headerRl.setLayoutParams(headerRlLayoutParams)

Первый параметр может быть wrap_content, зависит от того, что вы хотите, но второй должен быть match_parent, в противном случае он будет по умолчанию wrap_content, который будет позиционировать вашвид сверху

Создать headerParams как headerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT... И это все.При совпадении родительских элементов ваш взгляд занимает всю ширину родительского элемента.Если это именно то, что вам нужно, тогда посмотрите второй вариант ниже

Второй вариант: Если вы хотите, чтобы ваше представление было match_parent и использовалось полное представление, тогда ваша проблема: new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT Из-за того, что ваш текстовый вид будет соответствовать match_parent в макете, а также потому, что вы не установили гравитацию вида - у текста по умолчанию один - top / start.

И решение простое - Установить TextViewГравитация (которая аналогична установке параметра тяжести в XML) - представление останется как match_parent - принимая всю ширину макета своего родителя, но текст будет центрирован вертикально

initial.setGravity(Gravity.CENTER_VERTICAL);

И небольшая подсказка - вытакже можно установить в параметрах разработчика «Показать границы макета», чтобы увидеть, сколько места занимает ваш макет и как сами представления размещаются в макете. Это может помочь отладить и понять, что именно идет не так

0 голосов
/ 03 апреля 2019
initial.setGravity(Gravity.CENTER_VERTICAL);
0 голосов
/ 02 апреля 2019

Попробуйте с

 final RelativeLayout.LayoutParams headerParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80);

/**
 * Rule that centers the child vertically with respect to the
 * bounds of its RelativeLayout parent.
 */           
 headerParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);

 // your textview
 initial.setGravity(Gravity.CENTER_VERTICAL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...