Как динамически установить layout_gravity в карточку в Android

Я пытаюсь создать функциональность, похожую на чат, в своем приложении, а для текста чата я использую карточку. Я хочу, чтобы карточка была выровнена по правой стороне экрана для отправленных сообщений. Но когда я устанавливаю атрибут гравитации для родителя карточного представления, он работает со всеми другими атрибутами, но карточное представление не сдвинется с места. Пожалуйста, скажите мне, как установить layout_gravity для просмотра карты (динамический подход будет оценен). Спасибо.

Вот мой файл model_msg.xml, и настройки для отправленных сообщений выполняются в классе адаптера:

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_marginEnd="40dp"
    android:layout_marginTop="6dp"
    android:layout_marginBottom="6dp"
    android:layout_height="wrap_content"
    android:id="@+id/rl_msg"
    android:layout_gravity="center">

        <TextView
            android:paddingStart="8dp"
            android:text="Sender Name"
            android:maxLines="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_senderName"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentEnd="true" />

        <android.support.v7.widget.CardView
            android:layout_width="wrap_content"
            card_view:cardBackgroundColor="@color/cBgrMsg"
            card_view:cardElevation="6dp"
            android:layout_height="wrap_content"
            android:id="@+id/card_msgText"
            android:layout_below="@id/tv_senderName"
            card_view:cardCornerRadius="6dp">

        <TextView
        android:text="The message will come here which is gonna be a lot larger than this textView can handle and at that time to avoid any bugs or not to discard and functionalities I would have to utilize my mind a lot which is gonna be so tiresome and annoying that I  would think about leaving this app in middle without finishing it. Damn."
        android:padding="6dp"
        android:textSize="16sp"
        android:maxLength="500"
        android:layout_width="wrap_content"
        android:textColor="@color/cWhite"
        android:layout_height="wrap_content"
        android:id="@+id/tv_msg"
        android:layout_below="@id/tv_senderName" />

        </android.support.v7.widget.CardView>

    <TextView
        android:text="Nothing to show."
        android:padding="4dp"
        android:background="#0000"
        android:textSize="10sp"
        android:textStyle="italic"
        android:layout_width="wrap_content"
        android:gravity="start"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:textColor="#999999"
        android:layout_height="wrap_content"
        android:id="@+id/tv_sentAt"
        android:layout_below="@id/card_msgText" />
</RelativeLayout>

person Ashu    schedule 03.02.2017    source источник
comment
Я думаю, что это дубликат. Проверьте ссылку ниже. stackoverflow.com/questions/8049620/   -  person a.stefan    schedule 03.02.2017


Ответы (3)


Попробуйте так:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
yourCardViewHere.setLayoutParams(params);
person Valentino S.    schedule 03.02.2017
comment
Это дает мне ошибку: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams не может быть приведен к android.widget.RelativeLayout$LayoutParams - person Ashu; 03.02.2017
comment
Извините, я не видел, что это RelativeLayout, проверьте мой udapte - person Valentino S.; 03.02.2017
comment
Ну, я получил ответ где-то еще, но все равно спасибо. Лучше выбрать ответ, лол. - person Ashu; 03.02.2017

Оберните представление карты в LinearLayout. Затем установите гравитацию линейного макета с помощью setGravity (гравитация гравитации) в LinearLayout, как показано ниже. Имейте в виду, что я использую RecyclerView для повторения сообщений.

message_row_item.xml:

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

        <android.support.v7.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/message_text_view" />
        </android.support.v7.widget.CardView>
    </LinearLayout>

Логика пользовательского интерфейса:

    LinearLayout viewMessage = itemView.findViewById(R.id.message_view);

    if (messageList.get(position).getPeerId() == USER_PEER_ID) {
        viewMessage.setGravity(LEFT);
    } else {
        viewMessage.setGravity(RIGHT);
    }

Примечание:

Я попытался получить доступ к LayoutParams CardView и setForegroundGravity в карточке, как указано в других ответах, но мне не повезло, поэтому я реализовал его, как показано выше.

person S4NT14G0    schedule 24.11.2018

У меня есть правильный ответ, ребята, здесь: https://stackoverflow.com/a/35241091/4836759

В любом случае, спасибо, ребята.

   RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);

layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
cardView.setLayoutParams(layoutParams);
person Ashu    schedule 03.02.2017