布局毛刺:将RelativeLayout嵌套在LinearLayout中

时间:2016-12-12 16:25:40

标签: android android-layout

问题:我想澄清一个非常基本的布局问题。我已经在它2天无济于事。我只想在RelativeLayout中成功嵌套RelativeLayout并控制其定位。为此,我创建了2个布局:1个布局显示在左侧,1个布局显示在右侧。

我得到以下输出: 您可以看到第二个视图应该显示在右侧,但不是。我已经尝试过layout_gravity,但它没有用。

enter image description here

以下是布局: 左侧:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/message_view_border">

    <!--The message text-->
    <TextView
        android:id="@+id/message_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"/>
    <!--the timestamp-->
    <TextView
        android:id="@+id/time_stamp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/message_content"
        android:textStyle="bold"/>

</RelativeLayout>

右:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:background="@drawable/message_view_border"
    android:layout_gravity="right"
    android:gravity="right"
    android:layout_marginRight="8dp"
    android:layout_marginTop="8dp">

    <!--The message text-->
    <TextView
        android:id="@+id/message_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"/>
    <!--the timestamp-->
    <TextView
        android:id="@+id/time_stamp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/message_content"
        android:textStyle="bold"/>

</RelativeLayout>

以下是处理该方案的活动:

package com.example.testapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Activity1 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_1);

        //Get handle to the root view's child. i.e, FrameLayout
        ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
                .findViewById(android.R.id.content)).getChildAt(0);

        LayoutInflater inflater = LayoutInflater.from(this);
        LinearLayout linearLayout = (LinearLayout) viewGroup.findViewById(R.id.container_linear_layout);

        View message_receiver = inflater.inflate(R.layout.layout_chat_message_receiver, viewGroup, false);
        TextView received_content = (TextView)message_receiver.findViewById(R.id.message_content);
        received_content.setText("okay");
        linearLayout.addView(message_receiver);

        View message_sender = inflater.inflate(R.layout.layout_chat_message_sender, viewGroup, false);
        TextView sent_content = (TextView)message_sender.findViewById(R.id.message_content);
        sent_content.setText("okay");
        linearLayout.addView(message_sender);
    }
}

项目供您参考:https://github.com/mankum93/TestApp1

注意:我知道我问了一个类似的问题而没有答案。我再次问这个问题,因为人们在关于我用来填充动态视图列表的RecyclerView的问题中提出质疑。这可能是没有人能够确定问题的根本原因的原因。但是,既然问题是一个基本问题,即使没有RecyclerView也存在,我认为,这应该是另一个机会。

我搜索了几个论坛,文档和SO帖子,但无法解决此问题。

编辑1:我可以在这里看到混乱的根源: 这是主要的活动布局文件:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container_linear_layout">

    </LinearLayout>

    <!--Floating view to send messages layout-->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom">
        <EditText
            android:id="@+id/typed_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/send_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="SEND"
            android:layout_gravity="bottom"
            android:layout_weight="0"/>
    </LinearLayout>

</FrameLayout>

1 个答案:

答案 0 :(得分:1)

问题在于你夸大观点的方式:

inflater.inflate(R.layout.layout_chat_message_sender, viewGroup, false);

inflate()的第二个参数是根ViewGroup,它是您要充气的View的父级。您将第三个参数(attachToRoot)传递为false,但LayoutInflater仍将使用该根ViewGroup生成一组LayoutParams

在您的情况下,您将活动的根FrameLayout作为根传递给inflater,而实际上您将视图附加到LinearLayout

如此更改这些通胀线将解决您的问题:

inflater.inflate(R.layout.layout_chat_message_sender, linearLayout, false);