Проблема макета элемента представления Android Recycler

Я разрабатываю приложение в Android Studio. В предварительном просмотре это выглядит так, как я хочу, но при сборке приложения есть LinearLayout, который содержит два TextView, которые выглядят меньше, и я не понимаю, почему

Это элемент просмотра Recycler:

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:id = "@+id/friend_layout"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal">


    <de.hdodenhof.circleimageview.CircleImageView
    android:id = "@+id/profile_picture"
    android:layout_width = "44dp"
    android:layout_height = "44dp"
    android:src = "@drawable/head" />

        <LinearLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:orientation = "vertical">

    <TextView
        android:id = "@+id/name"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_marginStart = "1dp"
        android:gravity = "left"
        android:paddingLeft = "2dp"
        android:paddingRight = "2dp"
        android:textColor = "@color/white"
        android:textSize = "16sp"
        android:textStyle = "bold"
        tools:text = "Guillermo Rodriguez" />

    <TextView
        android:id = "@+id/friend_position"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:gravity = "left"
        android:text = "delantero"
        android:textColor = "@color/white"
        android:textSize = "13sp" />

</LinearLayout>

Вот как это выглядит: https://photos.app.goo.gl/BgNQhgpNKbgEGCCR6 и мне нужно, чтобы текст заполнил всю ширину

Я ожидаю увидеть оба TextView до конца экрана, но они заканчиваются до середины. Есть идеи?

@fitonga ваш внутренний LinearLayout имеет layout_width 600dp, если ваш экран шире, то он просто имеет ограниченное пространство. Почему бы вам не использовать match_parent для этого, если вы хотите, чтобы он был на весь экран?

Peregreen 10.04.2019 21:21

@Peregreen Я неправильно скопировал. Да, это match_parent, но происходит то же самое. Я поставил номер, чтобы проверить это, но это не сработало. Любая другая идея?

fitonga 10.04.2019 21:35

@fitonga, если этот макет предназначен для элемента внутри RecyclerView, также имеет значение, как вы его надуваете. Если вы не предоставите parent для надувания для onCreateViewHolder, то он не сможет надуть корневые LayoutParams и заменит ваш match_parent на wrap_content, что потенциально может повлиять на внутренний LinearLayout. Не могли бы вы опубликовать код надувания предмета?

Peregreen 10.04.2019 22:00

@Peregreen это метод onCreateViewHolder. Как вы думаете? Вам нужно какое-то другое? Переопределить общедоступный ViewHolder onCreateViewHolder (родитель ViewGroup, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from (context); View view = layoutInflater.inflate(R.layout.recycler_item_invite_friend, parent, false); вернуть новый ViewHolder (представление); }

fitonga 10.04.2019 22:23

@fitonga хм, интересно, выглядит хорошо. Очень странно, я бы порекомендовал использовать Layout Inspector и проверить, какие реальные параметры макета у вас есть в вашем представлении. Это очень удобный инструмент для такого рода расследований: developer.android.com/studio/debug/макет-инспектор

Peregreen 10.04.2019 22:33

Поверьте, если бы вы использовали ConstraintLayout, ваша жизнь была бы проще с этим. У меня были похожие проблемы с плотиной с LinearLayout. Глядя на ваш код, все выглядит нормально

Mehmet Katircioglu 11.04.2019 00:02
1
6
432
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если я правильно понял ваш вопрос, вы должны захотеть, чтобы два TextView заполнили всю высоту, не так ли?

В этом случае в обоих ваших TextView измените атрибут layout_height на 0dp и добавьте к ним android:layout_weigth=0.5. Это заставит их заполнить всю высоту вашего LinearLayout, какой бы она ни была, и они будут делить пространство прямо посередине.

Нет, я хочу, чтобы оба вида занимали всю ширину! Что происходит со мной, так это то, что если один из текстов "delantero", он появляется: "delan" и вниз "tero", и это происходит с обоими текстами, есть точка, где он разделяет его и вырезает. Я не знаю, почему

fitonga 10.04.2019 22:20

Вот как это выглядит: photos.app.goo.gl/BgNQhgpNKbgEGCCR6 и мне нужно, чтобы текст заполнил всю ширину

fitonga 10.04.2019 22:35

Я рекомендую вам использовать атрибут веса LinearLayout. установите корень LinearLayout на match_parent. и ваш вложенный LinearLayout и оба TextViewlayout_height к 0dp и их weight к 1 вот отредактированный код:

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:id = "@+id/friend_layout"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal">


<de.hdodenhof.circleimageview.CircleImageView
android:id = "@+id/profile_picture"
android:layout_width = "44dp"
android:layout_height = "44dp"
android:src = "@drawable/head" />

<LinearLayout
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_weight = "1"
android:orientation = "vertical">

    <TextView
    android:id = "@+id/name"
    android:layout_width = "0dp"
    android:layout_height = "wrap_content"
    android:layout_weight = "1"
    android:layout_marginStart = "1dp"
    android:gravity = "left"
    android:paddingLeft = "2dp"
    android:paddingRight = "2dp"
    android:textColor = "@color/white"
    android:textSize = "16sp"
    android:textStyle = "bold"
    tools:text = "Guillermo Rodriguez" />

    <TextView
    android:id = "@+id/friend_position"
    android:layout_width = "0dp"
    android:layout_height = "wrap_content"
    android:layout_weight = "1"
    android:gravity = "left"
    android:text = "delantero"
    android:textColor = "@color/white"
    android:textSize = "13sp" />

</LinearLayout>
</LinearLayout>

@fitonga извините, мой плохой, я потерял ширину и высоту вложенного LinearLayout. Я отредактировал свой ответ. Попробуйте новый код и дайте мне знать, как он работает.

AndroidSmoker74 10.04.2019 22:22

Теперь у меня та же ошибка, что и в первый раз

fitonga 10.04.2019 22:30

@fitonga, можете ли вы загрузить скриншот вашего завышенного макета? и объясните более подробно, как именно вы ожидаете, что он будет себя вести?

AndroidSmoker74 10.04.2019 22:33

Вот как это выглядит: photos.app.goo.gl/BgNQhgpNKbgEGCCR6 и мне нужно, чтобы текст заполнил всю ширину

fitonga 10.04.2019 22:34

Я взглянул на ваше изображение и внес некоторые изменения в код, попробуйте, дайте мне знать, как это работает, я изменил ширину и высоту TextViews.

AndroidSmoker74 10.04.2019 22:41

Я наблюдаю за этим с инспектором компоновки и понял, что проблема в LinearLayour, как вы видите, слышите: photos.app.goo.gl/bB3jFJqSHmvGSHfR7. Есть идеи, как это исправить?

fitonga 10.04.2019 22:47

@fitonga я посмотрю на это прямо сейчас и дам вам знать

AndroidSmoker74 10.04.2019 22:48

То же самое, не знаю в чем проблема, но думаю может дело не в этом .xml... В превью LinearLayout выглядит нормально, а в инспекторе выглядит не так, как в реальности, как в фото я загрузил

fitonga 10.04.2019 22:51

@fitonga У меня были похожие проблемы с инфляцией с LinearLayout раньше, попробуйте изменить friend_layout (корневой LinearLayout) на RelativeLayout и посмотреть, как это происходит, дайте мне знать.

AndroidSmoker74 10.04.2019 22:54

Кстати, @fitonga проверьте, какую ориентацию вы используете для менеджера линейной компоновки вашего RecyclerView.

AndroidSmoker74 10.04.2019 22:56

Это не сработало и с RelativeLayout. Где находится ориентация менеджера Linear Layout?

fitonga 10.04.2019 23:05

@fitonga загрузите использованный вами RelativeLayout, а также код LinearLayoutManager. Я посмотрю на это.

AndroidSmoker74 10.04.2019 23:07

@Override public ViewHolder onCreateViewHolder (родитель ViewGroup, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from (context); View view = layoutInflater.inflate(R.layout.recycler_item_invite_friend, parent, false); вернуть новый ViewHolder (представление); }

fitonga 10.04.2019 23:14

@Override public void onBindViewHolder (держатель ViewHolder, позиция int) { ViewGroup.LayoutParams lp =holder.friendLayout.getLayoutParams(); if (lp instanceof FlexboxLayoutManager.LayoutParams) { FlexboxLayoutManager.LayoutParams flexboxLp = (FlexboxLayoutManager.LayoutParams)holder.friendLayout.getLayoutParams(); flexboxLp.setFlexGrow(1.0f); }

fitonga 10.04.2019 23:14

если (selectedPlayersGlobal.contains(friends.get(position).id)) { selections.put(position, true); }holder.update(friends.get(position), position); }

fitonga 10.04.2019 23:14

Для относительного макета я просто меняю «LinearLayout» на «RelativeLAyout».

fitonga 10.04.2019 23:15

@fitonga Вы пытались установить для layoutInflater.inflate() для attachToRoot значение true ?

AndroidSmoker74 10.04.2019 23:23

@fitonga, когда вы изменили LinearLayout на RelativeLayout, был ли результат точно таким же?

AndroidSmoker74 10.04.2019 23:29

Пожалуйста, проверьте, имеет ли ваш RecycleView правильную ширину (например, match_parent) и может ли он растягиваться на всю ширину. Не могли бы вы предоставить код xml с RecycleView?

я думаю, вы установили recyclerview на определенную ширину. попробуйте изменить ширину в соответствии с родителем. Я рекомендую пользователю ограничивать макет, чтобы избежать вложенных групп просмотра. так:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:tools = "http://schemas.android.com/tools"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:id = "@+id/friend_layout"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content">


<ImageView
        android:id = "@+id/profile_picture"
        android:layout_width = "44dp"
        android:layout_height = "44dp"
        android:src = "@drawable/patient"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"/>


<TextView
        android:id = "@+id/name"
        android:layout_width = "0dp"
        android:layout_height = "wrap_content"
        android:layout_marginStart = "1dp"
        android:gravity = "left"
        android:paddingLeft = "2dp"
        android:paddingRight = "2dp"
        android:textColor = "@android:color/white"
        android:textSize = "16sp"
        android:textStyle = "bold"
        tools:text = "Guillermo Rodriguez"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toEndOf = "@+id/profile_picture"/>

<TextView
        android:id = "@+id/friend_position"
        android:layout_width = "0dp"
        android:layout_height = "wrap_content"
        android:gravity = "left"
        android:text = "delantero"
        android:textColor = "@android:color/white"
        android:textSize = "13sp"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toEndOf = "@+id/profile_picture"
        app:layout_constraintTop_toBottomOf = "@+id/name"/>

Ответ принят как подходящий

Я решил это! Кто-то настроил его с помощью GridLayoutManager, и он должен был быть с LinearLayoutManager. Я изменил его, и он был исправлен.

Другие вопросы по теме