2 votes

En utilisant le nouveau FirebaseRecyclerAdapter, comment aligner les textes sortants et entrants comme whatsapp ou facebook messenger, dans Android ?

P.S. EDIT Est-il possible d'aligner CardView de manière programmatique ?

J'ai trouvé quelques solutions pour l'ancien FirebaseRecyclerAdapter, mais elles ne fonctionnent pas. Avez-vous des suggestions ?

J'ai utilisé ce code en java, provenant d'un vieux post de SO mais cela n'a aucun effet

if (model.getReceiver() != "ADMIN")
                    holder.msgLinearLayout.setGravity(Gravity.LEFT | Gravity.START);
                else
                    holder.msgLinearLayout.setGravity(Gravity.RIGHT | Gravity.END);

Voici la disposition de l'activité de chat, avec seulement un RecyclerView et la disposition inférieure pour l'écriture et l'envoi de texte et d'images.

activité_chat.xml

    <LinearLayout 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"
    android:orientation="vertical"
    tools:context=".ChatActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view2"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></android.support.v7.widget.RecyclerView>

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/photoPickerButton"
            android:layout_width="36dp"
            android:layout_height="36dp"
            android:background="@android:drawable/ic_menu_gallery" />

        <EditText
            android:id="@+id/messageEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1" />

        <Button
            android:id="@+id/sendButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:enabled="false"
            android:text="@string/send_button_label"/>

    </LinearLayout>

</LinearLayout>

C'est la mise en page que j'utilise pour chaque entrée dans le RecyclerView. Elle comporte une CardView, contenant un LinearLayout qui contient des TextViews. Est-ce là que se situe le problème ? Devrais-je utiliser une mise en page linéaire ou relative dans la racine ?

chat_message_entry_layout.xml

    <android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardElevation="8dp"
    android:orientation="vertical"
    android:id="@+id/msgCardView"
    android:layout_margin="8dp">

    <LinearLayout
        android:id="@+id/msgLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/image"
            android:layout_width="200dp"
            android:layout_height="200dp"/>

        <TextView
            android:id="@+id/msg"
            android:textSize="20sp"
            android:layout_width="200dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/time"
            android:backgroundTint="#0e0d0e"
            android:layout_width="200dp"
            android:layout_height="wrap_content" />

    </LinearLayout>

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

1voto

blipinsk Points 467

C'est possible, mais setGravity n'est pas ce que vous recherchez.

Vous devriez obtenir le LayoutParams de votre LinearLayout et de mettre en place une gravité appropriée sur ceux-ci.

FrameLayout.LayoutParams params = 
                  (FrameLayout.LayoutParams) msgLinearLayout.getLayoutParams();
params.gravity = Gravity.LEFT;
msgLinearLayout.setLayoutParams(params);

Notez que le LayoutParams n'est pas LinearLayout.LayoutParams mais FrameLayout.LayoutParams . Cela s'explique par le fait que getLayoutParams concerne la disposition de l'enceinte de l msgLinearLayout (qui est le CardView ). CardView s'étend FrameLayout donc le type de params .


Si cela ne vous aide pas, j'aurai besoin de plus de données sur votre cas. Peut-être quelques illustrations de l'effet désiré ? et de ce à quoi il ressemble actuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X