2013-09-02 18 views
14

Come impostare la gravità in programmazione in un relativelayout. Ho un layout di XML con il nome chat_viewer_message.xml come di seguito:Come impostare la gravità in modo programmatico in un relativelayout

<?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> 

E codice della vista nella programmazione è il seguente:

@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; 
} 

Vedi gravità al relativelayout con id = sfondo, il default la gravità è SINISTRA, quindi voglio se! in arrivo il valore di gravità a relativelayout essere a DESTRA invece a SINISTRA.

Grazie.

risposta

19

Fusioni view al layout di contenitore, in questo caso RelativeLayout, e utilizzare setGravity(int) su di esso:

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); 
} 

Una parola di cautela (dai documenti):

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

Non errore: ma non influisce vista. ancora a sinistra. Grazie. –

0

È possibile utilizzare:

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

Per ulteriori informazioni sui parametri di gravità u può controllare questo: Gravity

+0

Errore: java.lang.ClassCastException: android.widget.AbsListView $ LayoutParams non può essere lanciato su android.widget.RelativeLayout $ LayoutParams –

+0

stai gonfiando il layout sbagliato: final int resource = R.layout.chat_viewer_message; L'ID del layout dell'elemento ListView è di sfondo, che è RelativeLayout no? – Jilberta

+0

Risolto, sfondo mi trasferisco in TextView, che id è di testo –

9

Esistono due modi principali per impostare la gravità in modo programmabile in un RelativeLayout. È possibile impostare la gravità per tutte le viste figlio (setGravity(int)) o impostare la gravità singolarmente (params.addRule(int)). Nota: questi metodi non sono disponibili per LinearLayout s.

Per impostare la gravità per tutti i bambini:

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

Per impostare la gravità per una singola vista nel giro di 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); 

Fonti:

5

Funziona perfettamente per il mio caso:

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 è il modo giusto, ha funzionato come un incantesimo, grazie – Mercury

0

Costruire il layout di chat e la manipolazione a livello di codice & sDirectionHasmap contiene direzione di ogni messaggio.

if (sDirectionHashMap.get(idsList.get(position)).equals("incoming")) { 
      holder.messageLayout.setGravity(Gravity.LEFT); 
     } else { 
      holder.messageLayout.setGravity(Gravity.RIGHT); 
     } 
Problemi correlati