问题:我想澄清一个非常基本的布局问题。我已经在它2天无济于事。我只想在RelativeLayout中成功嵌套RelativeLayout并控制其定位。为此,我创建了2个布局:1个布局显示在左侧,1个布局显示在右侧。
我得到以下输出: 您可以看到第二个视图应该显示在右侧,但不是。我已经尝试过layout_gravity,但它没有用。
以下是布局: 左侧:
<?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>
答案 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);