2016-12-12 120 views
0

问题:我想澄清一个非常基本的布局问题。我一直在这里呆了2天无济于事。我只是想成功将一个RelativeLayout嵌套在LinearLayout中并控制其定位。为此,我创建了2个布局:1个布局显示在左侧和右侧。布局故障:在LinearLayout中嵌套RelativeLayout

我收到以下输出: 您可以看到第二个视图应显示在右侧,但不是。我曾尝试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> 
+0

无需在屏幕截图中使用的亵渎。这是非常不专业的。 –

+0

@ Tanis.7x对不起。编辑。 –

+0

你的LinearLayout具有什么样的定向,是否有你用Java而不是xml添加布局的原因? – codeMagic

回答

1

问题是与你膨胀您的浏览方式:

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

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

对于您的情况,您的活动根目录FrameLayout作为根源传递给充气器,实际上,您将要将视图附加到LinearLayout

改变这些通胀线,像这样将解决你的问题:

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

自从他使用垂直LinearLayout以来,这仍然不能解决问题。特别是因为他表示他计划在将问题解决后将其添加回到xml中。 – codeMagic

+0

@codeMagic我认为你是误解了这个问题(或者我是)。 OP不希望这两件事情在同一行中。 OP希望两个气泡位于不同的线上,但是有一个左对齐和右对齐。基于这是一个聊天应用程序的上下文,我猜他正在寻找现在典型的信使风格布局。 –

+0

啊,你可能是对的。我只是读了左边和右边的部分,因为这是我们所有的东西。 – codeMagic