Макет Bubble Chat

У меня есть макет

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:background="@drawable/chat_bg"> <ImageView android:id="@+id/avatar" android:layout_width="32dip" android:layout_height="32dip" android:layout_marginRight="4dip" android:src="@drawable/avatar_1_1" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5sp" /> </LinearLayout> 

И в java-коде у меня есть:

 LayoutParams lp1 = (LayoutParams) textView.getLayoutParams(); LayoutParams lp2 = (LayoutParams) avatarView.getLayoutParams(); if (incoming) { lp1.gravity = Gravity.LEFT; lp2.gravity = Gravity.LEFT; textView.setBackgroundResource(R.drawable.speech_bubble_green); textView.setLayoutParams(lp1); avatarView.setLayoutParams(lp2); } else { lp1.gravity = Gravity.RIGHT; lp2.gravity = Gravity.RIGHT; textView.setBackgroundResource(R.drawable.speech_bubble_orange); textView.setLayoutParams(lp1); avatarView.setLayoutParams(lp2); } 

Я хочу, чтобы сообщение incomming, и его аватар будет выравниваться как Viber, исходящий слева , но все сообщения теперь выравниваются влево

Спасибо за все предложения

Решение здесь

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingRight="4dip" android:paddingBottom="4dip" android:background="@drawable/chat_bg"> <ImageView android:id="@+id/avatar" android:layout_width="32dip" android:layout_height="32dip" android:layout_marginLeft="4dip" android:src="@drawable/avatar_1_1" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/avatar" android:paddingLeft="4dip" /> 

И вот код Java:

 RelativeLayout bg = (RelativeLayout)view.findViewById(R.id.background); if (incoming) { textView.setBackgroundResource(R.drawable.speech_bubble_orange); bg.setGravity(Gravity.LEFT); } else { textView.setBackgroundResource(R.drawable.speech_bubble_green); LayoutParams avatarParams = (LayoutParams) avatarView.getLayoutParams(); avatarParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); avatarView.setLayoutParams(avatarParams); /*android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/avatar" android:paddingLeft="4dip"*/ LayoutParams tvParam = (LayoutParams) textView.getLayoutParams(); tvParam.removeRule(RelativeLayout.RIGHT_OF); tvParam.addRule(RelativeLayout.LEFT_OF, R.id.avatar); textView.setLayoutParams(tvParam); bg.setGravity(Gravity.RIGHT); } 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="fill_parent" <!-- android:layout_gravity="left" --> android:orientation="horizontal"> <ImageView android:id="@+id/avatar" android:layout_width="32dip" android:layout_height="32dip" android:layout_marginRight="4dip" android:src="@drawable/controller" /> <TextView android:id="@+id/text" android:text="asd" android:textColor="#FFFFFF" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5sp" /> </LinearLayout> 

Чтобы установить гравитацию в вашей деятельности:

 LinearLayout lp = (LinearLayout) findViewById(R.id.background); lp.setGravity(Gravity.RIGHT); lp.setGravity(Gravity.Left); 

Итак, единственное, что я изменил, это ваш LinearLayout в XML-файле, измените layout_width от fill_parent до wrap_content


EDIT: (из-за дополнительной информации)

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="left" android:orientation="horizontal"> <RelativeLayout android:id="@+id/avatar2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/text2"> <ImageView android:id="@+id/avatar" android:layout_width="32dip" android:layout_height="32dip" android:layout_marginRight="4dip" android:src="@drawable/controller" /> </RelativeLayout> <RelativeLayout android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/avatar"> <TextView android:id="@+id/text" android:text="asd" android:textColor="#FFFFFF" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> </RelativeLayout> 

Итак, используйте

 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)yourLayout.getLayoutParams(); params.addRule(RelativeLayout.RIGHT_OF, R.id.id_to_be_left_of); //params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); yourLayout.setLayoutParams(params); //causes layout update 

Не забывайте, что зависимости не могут быть круговыми

Intereting Posts
Поделиться файлом изображения из каталога кеша через Intent ~ android Передача массива в rsForEach в Renderscript Compute Циркуляр ListView (элементы на полукруге) Динамический регистр приемника C2DM с использованием registerReceiver Android с Nexus 6 – как избежать снижения приоритета аудиопотока OpenSL, связанного с фокусом приложения? Верхний индекс и подстрочный индекс в Android-приложении XML Тест блока Android для предварительного просмотра камеры? Получить только номер мобильного телефона Должен ли я содержать ссылки на фрагменты в рамках моей деятельности Получите оба сим-номера в двойном сим-телефоне для Android Не удается щелкнуть кнопки за DrawerLayout Отображение предварительного просмотра камеры Android до окончательного изображения Может ли startServce () вызываться из любого потока? Android – создание круговой маски на видео Переход от бесплатного приложения к платному приложению в Google Play