2016-11-16 3 views
1

У меня есть LinearLayout внутри RelativeLayout, и я хочу выровнять его вправо или влево в зависимости от значения (это простой чат, слева - собственный, справа - человек, который я говорю), это код макета:Выравнивание вправо/влево LinearLayout внутри RelativeLayout программно

 <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <LinearLayout 
       android:id="@+id/layout_chat_message" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:paddingLeft="@dimen/chat_margin_default" 
       android:paddingRight="@dimen/chat_margin_default" 
       android:layout_alignParentRight="true" 
       android:background="@drawable/textview_rounded_corners_receiver" 
       android:orientation="vertical"> 

       <TextView 
        android:id="@+id/textview_chat_message_text" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:textIsSelectable="true" 
        android:autoLink="all" 
        android:text="Se"/> 

       <TextView 
        android:id="@+id/textview_chat_message_date_info" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:textIsSelectable="false" 
        android:textAlignment="textEnd" 
        android:text="10:32" 
        android:maxLines="1" 
        android:textSize="@dimen/chat_message_text_font_size"/> 

      </LinearLayout> 


     </RelativeLayout> 

Как вы можете видеть android:layout_alignParentRight="true" свойство установлено.

Проблема заключается в том, когда я пытаюсь получить доступ к LayoutParams, чтобы установить их вправо или влево, программным, он бросает исключение произнесения:

java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams 

Это, как я получить доступ к LayoutParams:

  RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mChatMessageContainer.getLayoutParams(); 
      params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT); 
      params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 

Где mChatMessageContainer является:

 mChatMessageContainer = (View) v.findViewById(R.id.layout_chat_message); 

в последнее время не было ny linearLayout внутри относительной, и код работал нормально (я использовал TextView вместо LinearLayout), но мне это нужно сейчас.

Чтение документа, я предположил, что я обращаюсь к родительским параметрам макета, поэтому я отнес его к относительному, потому что, если я перейду на Linear, у меня будет такое же исключение.

Как можно настроить выравнивание с помощью этого метода linearLayout?

ответ

0

В LayoutParams используйте родительский вид LinearLayout вместо RelativeLayout.

использование

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.mChatMessageContainer.getLayoutParams(); 

вместо

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mChatMessageContainer.getLayoutParams(); 
+0

Но'LinearLayout.LayoutParams'does нет addRule, чтобы добавить'RelativeLayout.ALIGN_PARENT_RIGHT'property мне нужно. И, конечно, я не могу добавить свойство Relative Layout. –

+0

затем измените родительское представление как RelativeLayout – sasikumar

+0

Родительский просмотр уже является RelativeLayout. –

1

Попробуйте это:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
      params.setMargins(50,0,0,0); 
      params.gravity = Gravity.RIGHT; 
      holder.comment_layout.setLayoutParams(params); 
      holder.comment_layout.setPadding(dipToPixels(mContext, 5), dipToPixels(mContext, 5), dipToPixels(mContext, 18), dipToPixels(mContext, 5)); 

dipToPixels Метод:

public static int dipToPixels(Context context, float dipValue) { 
     DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
     int px =(int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics)); 

     return px; 
    } 
+0

Он выдает исключение: java.lang.ClassCastException: android.widget.LinearLayout $ LayoutParams нельзя отбрасывать в android.widget.RelativeLayout $ LayoutParams –

+0

Если ваш родительский макет Relative, тогда используйте RelativeLayout вместо LinearLayout. Я отредактировал свой ответ. – Nidhi

0

Попробуйте это:

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    relativeParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT //or left ,depends your value); 
    holder.mChatMessageContainer.getChildAt(0).setLayoutParams(relativeParams); 
Смежные вопросы