RelativeLayout高度填充剩余空间

我的xml文件中有以下布局:

  -- some images   Button 1 Button 2 Button 3 Button 4   Button 5   

也许我没有以最好的方式做到这一点。 我想要的是:让包含4个按钮的布局使用顶部和底部布局之间的整个空间,并且我希望按钮在布局中平行排列。

像这样: http : //img16.imageshack.us/i/androidq.png/

我添加了整个布局代码:

                 

  • 以编程方式在后台具有GL视图的软键盘上的EditText
  • RelativeLayout:对齐视图相对于其他视图居中水平或垂直
  • 即使没有使用FrameLayout,FrameLayout也会返回RelativeLayout ClassCastException
  • 为什么在使用wrap_content时忽略layout_marginBottom?
  • 使用没有TitleBar或ActionBar的导航抽屉
  • 以编程方式将RelativeLayout更改为RightOf toLeftOf
  • Android GLSurfaceView透明背景没有setZOrderonTop
  • 为什么我的相对布局占用全屏幕宽度
  • 尝试改变

      Button 1 Button 2 Button 3 Button 4  

    至:

         

    layout_weight应该均匀地将其分开

    希望它有效

    相对布局方法

    我有类似的情况,但我使用RelativeLayout而不是LinearLayout

    我基本上有2个标签(textViews)。 顶部应填充剩余空间,底部标签是文本句子,应包裹其内容但仍保留在容器底部。 这两个视图都在RelativeLayout容器中

    所以基本上:

     ------- parent container top ------------ | | | [label1 (auto expand)] | | | [label2 (fixed height)] ------- parent container bottom ------------ 

    技术

    1. 对于标签1,我将布局参数设置为MATCH_PARENT的宽度和高度,以便自动扩展。
    2. 为标签1添加规则,使其为ABOVE标签2(这是重要部分)

    然后是标签2:

    1. 使用MATCH_PARENT作为宽度,使用WRAP_CONTENT作为高度
    2. 然后将标签2的规则添加到ALIGN_PARENT_BOTTOM

    这个布局指令告诉Android系统:

    标签2应该包裹到其内容并固定到父容器的底部,同时标签1应该在坐在标签2上方时填充剩余空间。

    要记住的重要一点是设置为ALIGN_PARENT_SOMETHING的视图,例如ALIGN_PARENT_TOPALIGN_PARENT_BOTTOM是“优先级视图”。 应该相对于此“优先级视图”设置应填充剩余空间的所有其他视图。

    基本例子

    这是一个使用程序化方法的演示:

     package com.zhang.relodemo; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { // --------------------------------------------------- // Member Variables // --------------------------------------------------- RelativeLayout container; TextView label1; TextView label2; // --------------------------------------------------- // Property Methods // --------------------------------------------------- public RelativeLayout getContainer() { return container; } public void setContainer(RelativeLayout container) { this.container = container; } public TextView getLabel1() { return label1; } public void setLabel1(TextView label1) { this.label1 = label1; } public TextView getLabel2() { return label2; } public void setLabel2(TextView label2) { this.label2 = label2; } // --------------------------------------------------- // Methods // --------------------------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initViews(); initLayouts(); addViews(); } void initViews() { container = new RelativeLayout(this); label1 = new TextView(this); label1.setText("The quick brown fox jumped over the lazy dog."); label1.setBackgroundColor(Color.LTGRAY); label1.setGravity(Gravity.CENTER); label1.setTextSize(20); label2 = new TextView(this); label2.setText("Label 2 is a short label compared to label1.It has two lines but take up a fraction of the space."); label2.setBackgroundColor(Color.GRAY); label2.setTextSize(20); label2.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); } void initLayouts() { container.setId(View.generateViewId()); label1.setId(View.generateViewId()); label2.setId(View.generateViewId()); // --------------------------------------------------- // Parent Container Constraints // --------------------------------------------------- RelativeLayout.LayoutParams containerLayoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ); container.setLayoutParams(containerLayoutParams); // --------------------------------------------------- // Label Constraints // --------------------------------------------------- RelativeLayout.LayoutParams label1LayoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ); // -------------------------------------- // THIS IS THE IMPORTANT STEP HERE // // It tells label1 to be above label2 // while expanding vertically. // -------------------------------------- label1LayoutParams.addRule(RelativeLayout.ABOVE, label2.getId()); label1.setLayoutParams(label1LayoutParams); RelativeLayout.LayoutParams label2LayoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ); // ------------------------------------------ // this pins label2 to the parent // container's bottom, preventing label1 // from forcing label2 off bottom of screen // ------------------------------------------ label2LayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); label2.setLayoutParams(label2LayoutParams); } void addViews() { getContainer().addView(getLabel1()); getContainer().addView(getLabel2()); this.setContentView(getContainer()); } } 

    或者它的XML等价物:

         

    应该给你以下结果:

    演示截图