如何在RelativeLayout中通过编程方式设置重力?

21

如何在RelativeLayout中编程设置重力。 我有一个名为chat_viewer_message.xml的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;
}

在相对布局中查看id = background的重力(Gravity)属性,默认值为LEFT,因此我希望如果!incoming(没有传入值),则相对布局中的重力属性应为RIGHT而不是LEFT。

谢谢。

6个回答

28

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

注意事项(摘自文档):

请注意,由于RelativeLayout认为每个子元素相对于其他子元素的位置是重要的,因此设置gravity将影响所有子元素作为单个单位在父元素中的定位,这发生在子元素被相对定位之后。


16

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

来源:


8

对于我的情况,它完美地发挥作用:

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

addRule 是正确的方法,非常有效,谢谢。 - Mercury

0

构建聊天界面布局并以编程方式进行操作 & sDirectionHasmap 包含每条消息的方向。

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

0

您可以使用:

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

关于重力参数的更多信息,您可以查看此链接:Gravity


错误:java.lang.ClassCastException:android.widget.AbsListView$LayoutParams无法转换为android.widget.RelativeLayout$LayoutParams。 - Loren Ramly
你正在加载错误的布局:final int resource = R.layout.chat_viewer_message; 你的ListView项布局ID是background,这不是RelativeLayout吗? - Jilberta
已解决,背景我移动到ID为text的TextView。 - Loren Ramly
11
RelativeLayout.LayoutParams没有gravity属性。 - Jason

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接