2013-09-02 15 views
14

相対的なレイアウトでプログラミング的に重力を設定する方法。プログラミングで相対的なレイアウトでプログラム的に重力を設定する方法

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

は、ID =背景、デフォルトでrelativelayoutで重力を参照してください私は以下のように名前chat_viewer_message.xmlとXMLのレイアウトを持っています重力はLEFTなので、もし私が欲しいのであれば、relativelayoutの値重力はLEFTではなくRIGHTになります。

ありがとうございました。

を使用でき

答えて

19

を、その上に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); 

uがこのチェックすることができます。この場合RelativeLayoutには、コンテナのレイアウトにviewキャストGravity

+0

エラー:java。lang.ClassCastException:android.widget.AbsListView $ LayoutParamsをandroid.widgetにキャストすることはできません.RelativeLayout $ LayoutParams –

+0

間違ったレイアウトを展開しています:final int resource = R.layout.chat_viewer_message;あなたのListViewアイテムレイアウトIDは、RelativeLayoutではないバックグラウンドですか? – Jilberta

+0

解決済み、背景はテキストビューに移動します。idはテキストです –

9

プログラムで重力を設定するには、RelativeLayoutの2つの主な方法があります。すべての子ビューの重力を設定するか(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); 
     } 
関連する問題