Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android, How to get/set layout parameters?

In my application I have a conversation room. All of my messages should be aligned to right while the rest should be left aligned.

Single row of my list is like this:

<?xml version="1.0" encoding="utf-8"?>

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

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@drawable/speech_bubble_orange"
        android:id="@+id/llGroup" >

            <TextView
                android:id="@+id/message_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:shadowColor="@color/message_textShadow"
                android:shadowDx="1"
                android:shadowDy="1"
                android:text="Medium Text"
                android:textColor="@color/message_textColor"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/message_date"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/temp_date"
                android:gravity="right"
                android:layout_marginLeft="4dp"
                android:layout_marginRight="4dp"/>
    </LinearLayout>

</LinearLayout>

getView() of my adapter is like this:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = myInflater.inflate(R.layout.list_message_row, null);
        holder = new ViewHolder();

        holder.tvMessageBody = (TextView) convertView.findViewById(R.id.message_text);
        holder.tvMessageDate = (TextView) convertView.findViewById(R.id.message_date);
        holder.llContainer = (LinearLayout) convertView.findViewById(R.id.llContainer);
        holder.llGroup = (LinearLayout) convertView.findViewById(R.id.llGroup);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.tvMessageBody.setText(messageList.get(position).getMessageBody());
    String date = messageList.get(position).getSentDate();
    holder.tvMessageDate.setText(formatFanciedDate(date));

    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.llContainer.getLayoutParams();
    try {
        if(messageList.get(position).isMine()) {
            holder.llGroup.setBackgroundResource(R.drawable.speech_bubble_green);
            params.gravity = Gravity.RIGHT;
        }
        //If not mine then it is from sender to show orange background and align to left
        else {
            holder.llGroup.setBackgroundResource(R.drawable.speech_bubble_orange);
            params.gravity = Gravity.LEFT;
        }

        holder.llContainer.setLayoutParams(params);

    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    return convertView;
}

I think everything should be fine however when I run the application NullPointerException happens and points to params.gravity = Gravity.RIGHT; or params.gravity = Gravity.LEFT; (depends on isMine() method).

What you think? Where is my mistake? Any suggestion would be appreciated.

like image 656
Hesam Avatar asked Dec 06 '22 08:12

Hesam


2 Answers

getLayoutParams() will return null until the view is attached to its parent.

Try to create the layout params with its constructor rather than using getLayoutParams().

like image 80
tbruyelle Avatar answered Dec 08 '22 20:12

tbruyelle


Use RelativeLayout params and set gravity like this, it will work.

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);

This is working for me in my application.

like image 41
RajaReddy PolamReddy Avatar answered Dec 08 '22 20:12

RajaReddy PolamReddy