02 Activity窗口对象上的布局

原创 2017年09月19日 01:35:19

Activity窗口对象可以通过调用 setContentView()设置要显示的控件,但只能设置一个View对象。如窗口上有多个按钮等多个控件时,则需要使用布局对象来管理控件的显示位置及对齐方式.

布局控件等的类有: ConstraintLayout, GridLayout, FrameLayout, LinearLayout, RelativeLayout, TableLayout等.

可创建一个布局类对象用于管理多个控件。如实现用LinearLayout对象来管理两个按钮控件, 按水平排列:
工程沿用上一个例子:

/* MyActivity.java */
mport android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;


public class MyActivity extends Activity {
    private Button btn, btn2;
    private LinearLayout layout;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //调用父类的功能

        layout = new LinearLayout(this); //创建布局类对象
        layout.setOrientation(LinearLayout.HORIZONTAL); //设置水平布局

        btn = new Button(this); //创建按钮对象
        btn.setText("btn1"); //设置按钮显示的文本

        btn2 = new Button(this);
        btn2.setText("btn2");

        layout.addView(btn); //让布局管理器管理按钮
        layout.addView(btn2);
        setContentView(layout);

    }
}

效果图:
这里写图片描述


布局管理器还可以通过setLayoutParams()来设置布局管理器对窗口的布局范围。
其中布局的宽度和高度的选择可以是MATCH_PARENT和WRAP_CONTENT.
MATCH_PARENT是表示占完用上一级窗口或布局管理器的空间.
WRAP_CONTENT是表示根据要显示的内容调整实际的占用空间.

如一个LinearLayout对象管理整个窗口的空间,则可以:

        layout = new LinearLayout(this); //创建布局类对象
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

        layout.setLayoutParams(params);
        setContentView(layout);

再如用LinearLayout对象水平布局两个按钮对象, 则每个按钮对象都需要setLayoutParams()来设置布局参数. 实现一个按钮布局管理器的30%宽度, 一个按钮占70%宽度, 两个按钮的高度与布局管理器的高度一致

/* MyActivity.java */
package com.example.jk.a01hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;


public class MyActivity extends Activity {
    private Button btn, btn2;
    private LinearLayout layout;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //调用父类的功能

        layout = new LinearLayout(this); //创建布局类对象
        layout.setOrientation(LinearLayout.HORIZONTAL); //设置水平布局
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                      LinearLayout.LayoutParams.MATCH_PARENT);

        layout.setLayoutParams(params);

        btn = new Button(this);
        btn.setText("btn1");

        btn2 = new Button(this);
        btn2.setText("btn2");

        btn.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 30));
        btn2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 70));

        layout.addView(btn); //让布局管理器管理按钮
        layout.addView(btn2);
        setContentView(layout);

    }
}

效果图:
这里写图片描述


而且布局管理器还可以嵌套使用。如在窗口上实现4个按钮分成每两个按钮一行, 其中第一行占窗口的30%高度,剩下的高度由第二行占用. 而且第一行的两个按钮,一个占40%宽度,另一个占用60%宽度。第二行的两个按钮占用的宽度都是50%.

每一行的两个按钮对象由一个水平的LinearLayout对象来管理, 共需要两个水平的LinearLayout布局管理器,最后由一个垂直的LinearLayout对象来管理这两个水平的布局管理器.

/* MyActivity.java */
package com.example.jk.a01hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;


public class MyActivity extends Activity {
    private Button btn1, btn2, btn3, btn4;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //调用父类的功能

        LinearLayout hlayout1, hlayout2, vlayout;

        hlayout1 = new LinearLayout(this);
        hlayout1.setOrientation(LinearLayout.HORIZONTAL);
        hlayout2 = new LinearLayout(this);
        hlayout2.setOrientation(LinearLayout.HORIZONTAL);

        vlayout = new LinearLayout(this);
        vlayout.setOrientation(LinearLayout.VERTICAL);

         btn1 = new Button(this);
         btn1.setText("btn1");
         btn2 = new Button(this);
         btn2.setText("btn2");
         btn3 = new Button(this);
         btn3.setText("btn3");
         btn4 = new Button(this);
         btn4.setText("btn4");

         hlayout1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 30));
         hlayout2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 70));
         vlayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));

         btn1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 40));
         btn2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 60));
         hlayout1.addView(btn1);
         hlayout1.addView(btn2);

         btn3.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 50));
         btn4.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 50));
         hlayout2.addView(btn3);
         hlayout2.addView(btn4);

         vlayout.addView(hlayout1);
         vlayout.addView(hlayout2);

         setContentView(vlayout);
    }
}

效果图:
这里写图片描述
 

版权声明:本文为博主原创文章,未经博主允许转载。

Android应用程序窗口(Activity)的窗口对象(Window) 的创建过程分析

每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它...
  • linghu_java
  • linghu_java
  • 2015年01月22日 10:36
  • 909

获取activity的根布局

最近有些同学问我为什么activity有setContentView( int id ),为什么没有getContentView()这个方法呢?这个我真没办法回答,但是我能告诉你怎么去拿activit...
  • c_cayujie
  • c_cayujie
  • 2017年01月12日 19:35
  • 5387

怎样将Activity设置成窗口模式

将Activity设置成窗口模式有两种方法,一种是利用系统提供的theme在清单配置文件中设置当前Activity的theme属性。另一种就是根据项目的需求自定义主题。 第一种方法: 在A...
  • Zuo_0625
  • Zuo_0625
  • 2016年05月05日 17:50
  • 2683

Android中在activity用代码动态添加布局

在activity中或fragment中动态添加布局 效果 项目结构 核心代码: MainActivity public class MainActivity extends Activit...
  • zhaihaohao1
  • zhaihaohao1
  • 2015年01月12日 12:40
  • 2288

Android源码解析(十八)-->Activity布局绘制流程

这篇文章是承接上一篇文章来写的,大家都知道Activity在Android体系中扮演者一个界面展示的角色,通过上一篇文章的分析,我们知道Activity是通过Window来控制界面的展示的,一个Win...
  • qq_23547831
  • qq_23547831
  • 2016年05月01日 00:28
  • 16127

四种基本布局(二)、Activity的操作

四种基本布局下面接着上一篇博客,写下另外两种布局FrameLayoutFrameLayout又称帧布局,这种布局没有任何的定位方式,所有的控件都会摆在布局的左上角。以后在学习碎片的时候,会用到这种布局...
  • aiynmimi
  • aiynmimi
  • 2015年08月19日 21:04
  • 805

一个Activity分别加载多个layout布局文件

要点:使用setContentView和setTitle方法。
  • HorrorKwan
  • HorrorKwan
  • 2017年12月08日 15:17
  • 159

Android学习笔记-Activity窗口的创建过程

Window表示一个窗口的概念,android中所有的视图都是通过Window来呈现的,Activity,Dialog,Toast他们的视图都是附加到Window上的。这篇博客讨论的是Activity...
  • u014738387
  • u014738387
  • 2016年04月27日 12:29
  • 839

Activity窗口设置大小

我们知道Activity本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上。所以,我們控制窗口的...
  • xieyihua1994
  • xieyihua1994
  • 2016年09月19日 15:34
  • 1959

Activity传递一个或者多个对象

转载自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1280857   Activity之间传递对象,或者通过Bundle传递对象的两种方式。...
  • lv18092081172
  • lv18092081172
  • 2016年07月11日 11:57
  • 347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:02 Activity窗口对象上的布局
举报原因:
原因补充:

(最多只允许输入30个字)