2013-09-02 2 views
14

Как установить гравитацию в программировании в режиме релятивирования. У меня есть макет XML с именем chat_viewer_message.xml, как показано ниже:Как установить гравитацию программно в режиме релятивирования

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/background" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingRight="4dip" 
    android:paddingBottom="4dip" 
    android:gravity="left" 
    android:background="@drawable/chat_bg_in"> 

    <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" 
     /> 

</RelativeLayout> 

И код зрения в программировании, как показано ниже:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final int type = getItemViewType(position); 
     final View view; 
     if (convertView == null) { 
      final int resource = R.layout.chat_viewer_message; 
      view = activity.getLayoutInflater() 
        .inflate(resource, parent, false); 
      if (type == TYPE_MESSAGE) 
       ((TextView) view.findViewById(R.id.text)).setTextAppearance(
         activity, appearanceStyle); 
     } else 
      view = convertView; 



     final MessageItem messageItem = (MessageItem) getItem(position); 
     String name; 
     final String account = messageItem.getChat().getAccount(); 
     final String user = messageItem.getChat().getUser(); 
     final String resource = messageItem.getResource(); 
     final boolean incoming = messageItem.isIncoming(); 
     final String server_host = view.getResources().getString(
       R.string.server_host); 
     if (isMUC) { 
      name = resource; 
     } 


     if (incoming) { 
      view.setBackgroundResource(R.drawable.chat_bg_in); 
     } else { 
      // I WANT TO GRAVITY TO RIGHT. HOW TO CODE? THANKS 
      view.setBackgroundResource(R.drawable.chat_bg_out); 
     } 

     return view; 
} 

См гравитацию на RelativeLayout с ид = фон, по умолчанию сила тяжести ЛЕВАЯ, поэтому я хочу, чтобы при входе значение силы тяжести при относительной скорости было ПРАВИЛЬНО вместо ЛЕВАЯ.

Спасибо.

ответ

19

Cast view для размещения контейнера, в этом случае RelativeLayout и использовать setGravity(int) на нем:

if (incoming) { 
    view.setBackgroundResource(R.drawable.chat_bg_in); 
} else { 
    // I WANT TO GRAVITY TO RIGHT. HOW TO CODE? THANKS 
    view.setBackgroundResource(R.drawable.chat_bg_out); 

    ((RelativeLayout) view).setGravity(Gravity.RIGHT); 
} 

Осторожно (из документов):

Note that since RelativeLayout considers the positioning of each child relative to one another to be significant, setting gravity will affect the positioning of all children as a single unit within the parent. This happens after children have been relatively positioned.

+0

Не ошибка: но не эффект. все еще слева. Благодарю. –

0

Вы можете использовать:

RelativeLayout.LayoutParams paramas = new RelativeLayout.LayoutParams(); 
params.gravity = Gravity.RIGHT; 
view.setLayoutParams(params); 

Для получения дополнительной информации о параметрах тяжести и можно проверить следующим образом: Gravity

+0

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

+0

вы раздуваете неправильный макет: final int resource = R.layout.chat_viewer_message; Ваш идентификатор макета элемента ListView является фоном, который является RelativeLayout, не так ли? – Jilberta

+0

Решено, фон Я перехожу к textview, который является текстом –

9

Существует два основных способа программно установить плотность в RelativeLayout. Вы можете установить гравитацию для всех дочерних видов (setGravity(int)) или установить гравитацию индивидуально (params.addRule(int)). Примечание. Эти методы недоступны для LinearLayout с.

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

RelativeLayout relativeLayout = findViewById(R.id.myRelativeLaout); 
relativeLayout.setGravity(Gravity.CENTER); 

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

MyView myView = findViewById(R.id.myView); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
myView.setLayoutParams(params); 

Источники:

5

Он отлично работает для моего случая:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, 
        RelativeLayout.LayoutParams.WRAP_CONTENT); 

    layoutParams.topMargin = 700;//in my case 
    layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);//in my case 
    varButton.setLayoutParams(layoutParams); 
+0

addRule - правильный путь, работал как шарм, спасибо – Mercury

0

Построение макета чат и управления программным способом & sDirectionHasmap содержит направление каждого сообщения.

if (sDirectionHashMap.get(idsList.get(position)).equals("incoming")) { 
      holder.messageLayout.setGravity(Gravity.LEFT); 
     } else { 
      holder.messageLayout.setGravity(Gravity.RIGHT); 
     } 
Смежные вопросы