Почему установка «layout_width» RelativeLayout с фиксированным значением в layout xml не работает? - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу установить ширину и высоту RelativeLayout в фиксированное значение.Мой item_view.xml выглядит следующим образом;

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:orientation="vertical"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="abc"/>

</RelativeLayout>

Вот activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </RelativeLayout>

</android.support.constraint.ConstraintLayout>

И, наконец, моя функция generateView в MainActivity.java;

private void generateItemView()
{
    LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.item_view, null);

    RelativeLayout containerView = findViewById(R.id.container);
    containerView.addView(itemView);
}

И это результат;

enter image description here

Как видите, это не размер 100dpX100dp.

С другой стороныстороны, если я делаю это программно, это работает.Вот обновленная функция generateView;

private void generateItemView()
{
    LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.item_view, null);

    int sizeDp = 100;
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    int sizePx = Math.round(sizeDp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(sizePx, sizePx);
    itemView.setLayoutParams(params);

    RelativeLayout containerView = findViewById(R.id.container);
    containerView.addView(itemView);
}

enter image description here

И она прекрасно работает ...

Мой вопрос: почемумы не можем использовать свойства layout_width и layout_height в XML-файле макета?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Ваша проблема в этой строке:

View itemView = layoutInflater.inflate(R.layout.item_view, null);

Когда вы передаете null в качестве родителя, любые атрибуты layout_ будут игнорироваться.Чтобы сохранить их и заставить их вступить в силу, вы должны передать родителя.

View itemView = layoutInflater.inflate(R.layout.item_view, containerView, false);

Ваша IDE должна предупредить вас об этом случае:

enter image description here

0 голосов
/ 25 сентября 2018

Возможно, вам нужно установить родителя в вашем вызове layoutinflator.inflate: layoutinflator.inflate(R.layout.item_view, containerview, false);.Вам также нужно будет перестроить код, чтобы он запускался после создания экземпляра контейнера.

Чтобы получить более подробный ответ, почему это происходит, ознакомьтесь с https://stackoverflow.com/a/5027921

...