Android Studio Constraintlayout以编程方式右对齐

时间:2018-07-29 09:53:22

标签: android android-constraintlayout

我正在制作一个聊天应用程序,消息布局有些麻烦。我希望已登录用户发送的邮件与布局的右侧对齐,而其他组成员发送的邮件与左侧的对齐。

这是我的xml文件:

<android.support.constraint.ConstraintLayout
android:id="@+id/container_message"
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"
android:layout_marginTop="8dp">

<ImageView
    android:id="@+id/user_image"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_marginStart="8dp"
    android:src="@color/colorBlack"
    app:layout_constraintBottom_toBottomOf="@+id/container_message_text"
    app:layout_constraintStart_toStartOf="parent" />

<TextView
    android:id="@+id/date_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp"
    android:fontFamily="@font/rubik_light"
    android:text="19 juni, 00:32"
    android:textSize="10sp"
    app:layout_constraintStart_toStartOf="@+id/container_message_text"
    app:layout_constraintTop_toBottomOf="@+id/container_message_text" />

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container_message_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="48dp"
    android:paddingStart="12dp"
    android:paddingTop="12dp"
    android:paddingEnd="12dp"
    app:cardBackgroundColor="@color/colorTextWhite"
    app:cardCornerRadius="16dp"
    app:cardElevation="0dp"
    app:layout_constraintStart_toStartOf="parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingStart="12dp"
        android:paddingTop="7dp"
        android:paddingEnd="12dp"
        android:paddingBottom="7dp">

        <TextView
            android:id="@+id/message_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/rubik"
            android:textSize="16sp"
            android:maxWidth="240dp" />
    </FrameLayout>

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

当前布局的图片: Picture of the current layout

我需要将紫色消息右对齐,该如何以编程方式完成?

1 个答案:

答案 0 :(得分:0)

您最好尝试将发件人和您的消息使用两种不同的布局进行聊天布局,如果您使用的是recyclerview,则以下适配器可能会对您有所帮助。

public class MessageListAdapter extends RecyclerView.Adapter {
private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;

private Context mContext;
private List<UserMessage> mMessageList;

public MessageListAdapter(Context context, List<UserMessage> messageList) {
    mContext = context;
    mMessageList = messageList;
}

@Override
public int getItemCount() {
    return mMessageList.size();
}

// Determines the appropriate ViewType according to the sender of the message.
@Override
public int getItemViewType(int position) {
    UserMessage message = (UserMessage) mMessageList.get(position);

    if (message.getSender().getUserId().equals(currentUserId)) {
        // If the current user is the sender of the message
        return VIEW_TYPE_MESSAGE_SENT;
    } else {
        // If some other user sent the message
        return VIEW_TYPE_MESSAGE_RECEIVED;
    }
}

// Inflates the appropriate layout according to the ViewType
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;

    if (viewType == VIEW_TYPE_MESSAGE_SENT) {
        view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.item_message_sent, parent, false);
        return new SentMessageHolder(view);
    } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
        view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.item_message_received, parent, false);
        return new ReceivedMessageHolder(view);
    }

    return null;
}

// Passes the message object to a ViewHolder so that the contents can be bound to UI.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    UserMessage message = (UserMessage) mMessageList.get(position);

    switch (holder.getItemViewType()) {
        case VIEW_TYPE_MESSAGE_SENT:
          ((SentMessageHolder) holder).bind(message);
          break;
        case VIEW_TYPE_MESSAGE_RECEIVED:
          ((ReceivedMessageHolder) holder).bind(message);
    }
}

private class SentMessageHolder extends RecyclerView.ViewHolder {

    SentMessageHolder(View itemView) {
        super(itemView);

        //bind views
    }

    void bind(UserMessage message) {
        //set values
    }
}

private class ReceivedMessageHolder extends RecyclerView.ViewHolder {

    ReceivedMessageHolder(View itemView) {
        super(itemView);

        //bind views
    }

    void bind(UserMessage message) {
        //set values
    }
}
}