Подтвердить что ты не робот

Как установить гравитацию программно в режиме релятивирования

Как установить гравитацию в программировании в режиме релятивирования. У меня есть 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 с id = фон, значение по умолчанию - LEFT, поэтому я хочу, чтобы при входе значение силы тяжести при относительной вероятности было ПРАВИЛЬНО вместо LEFT.

Спасибо.

4b9b3361

Ответ 1

Вставьте 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 учитывает расположение каждого дочернего элемента относительно друг друга, чтобы быть значительными, установка силы тяжести повлияет позиционирование всех детей как единое целое внутри родителя. Это происходит после того, как дети были относительно расположены.

Ответ 2

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

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

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

Источники:

Ответ 3

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

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

Ответ 4

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

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

Для получения дополнительной информации о параметрах силы тяжести u можете проверить это: Gravity

Ответ 6

Создание макета чата и его программное управление и amp; sDirectionHasmap содержит направление каждого сообщения.

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