导航:首页 > 操作系统 > android合并布局

android合并布局

发布时间:2023-01-14 19:32:04

android 布局优化 Merge的使用

从本文你可以快速了解布局中merge标签的作用,以及使用。

layout1.xml

layout2.xml:

实际效果:

layout1.xml

layout2.xml:

实际效果:

如有不足之处,请多多指教。

参考:

❷ 如何将两个android项目合并成一个

把想作为依赖库的项目作为Library,例如想把B项目作为依赖库:
1、右键项目-->Properties--->点击左边菜单Android--->勾选IsLibrary:

❸ 关于Android布局你不知道的

Android常见的5个布局,我想大家一定不会陌生。LinearLayout、RelativeLayout和FrameLayout也是使用频率较高的布局方式,做Android开发的一定使用过。

传统的5种布局方式:

不过我的问题并不是问面试者如何使用这些基础的布局,而是要看面试者怎么解决布局嵌套(影响性能)和屏幕适配问题。

我们都清楚Android界面的布局太复杂,嵌套层次过深,会使整个界面的测量、布局和绘制变得更复杂,对性能会造成影响。所以我们在写Layout文件时,也要尽量避免布局的嵌套层次过深的问题。

在怎么解决问题之前,我们得有一个好方法先判断当前的问题情况。Android SDK工具箱中有一个叫做Hierarchy Viewer的工具,能够在App运行时分析Layout。

注意: 在ROOT的手机,或者是安装开发版的ROM的手机可以直接使用Hierarchy Viewer。如果没有Root的手机(SDK 4.1及以上),需要在你的PC端添加一个环境变量“ANDROID_HVPROTO=ddm”。

下面列举一些面试者常使用的方式。

merge merge标签的作用是合并UI布局,使用该标签能降低UI布局的嵌套层次。

merge标签可用于两种情况:

ViewStub ViewStub标签引入的布局默认不会inflate,既不会显示也不会占用位置。 ViewStub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如数据加载进度布局、出错提示布局等。

需要在使用时手动inflate:

ViewStub在一定的程度可以起到减少嵌套层次的作用,特别是很多时候我们的程序可能不需要走到ViewStub的界面。

include 将可复用的组件抽取出来并通过include标签使用,但<include>标签能减少布局的层次吗?

我认为不能。include主要解决的是相同布局的复用问题,它并不能减少布局的层次。

用RelativeLayout代替LinearLayout

很多人为了减少布局层次喜欢用RelativeLayout代替LinearLayout,不过可能达到的效果并不会很明显。层次是减少了,但本身RelativeLayout就会比LinearLayout性能差一点。

有一些界面,比如一个图片和一个文本的布局(ListItem常见的布局方式),可以利用TextView有drawableLeft, drawableRight等属性,完全不需要RelativeLayout或者LinearLayout布局。

传统的布局方式存在一定的缺陷,如RelativeLayout要两次测量(measure)它的子View才能知道确切的高度;如果LinearLayout布局的子View有设置了layout_weight,那么它也需要测量两次才能获得布局的高度。

相对于传统的布局方式,Android官方还推出了两种新的布局方式:ConstraintLayout和FlexboxLayout。

ConstraintLayout ConstraintLayout即约束布局,在2016年由Google I/O推出。ConstraintLayout和RelativeLayout有点类似,控件之间根据依赖关系而存在,但比RelativeLayout更加灵活。创建大型复杂的布局仍然可以使用扁平的层级(不用嵌套View Group),说的简单些就是,再复杂的界面也可以只有2层层次。

要使用ConstraintLayout需要在build.gradle中添加相关的support库:

使用ConstraintLayout可以有效的解决布局嵌套过多导致的性能问题,官方也对其渲染性能进行了优化,并且ConstraintLayout支持可视化的方式编写布局。

不过学会熟练使用ConstraintLayout会需要一点时间,但这是值得的。

FlexBoxLayout 做过前端开发(CSS方面)的同学对FlexBox一定不会陌生,最近我在做微信小程序开发时也涉及到FlexBox。FlexBox(弹性布局)是w3c在2009年提出的一种新的布局方案,解决以前那种传统css的盒模型的局限性。

Google开源了FlexboxLayout布局和前端CSS FlexBox布局具有相同的功能(肯定有不一样的地方),但已经足够在Android上改进布局的构建方式。

FlexBoxLayout可以理解成一种更高级的LinearLayout,不过比LinearLayout更加强大和灵活。如果我们使用LinearLayout布局的话,那么不同的分辨率,也许我们要重新调整布局,势必会需要跟多的布局文件放在不同的资源目录。而使用FlexBoxLayout来布局的话,它可以适应各种界面的改变(所以叫响应式布局)。

如果对前端的Flexbox不太了解的话,你还需要补一些概念,好在这些东西在网上很容易找到。

可能很多读者会觉这样的面试题是吹毛求疵,很多项目中哪有这么复杂的界面,根本就用不到这些优化措施。

可以说厉害的人,或者叫高手,可能只是比较多在意这些细节而已。在实践中的经历告诉我,很多难于解决的性能问题,并不是因为有一个影响性能的问题无法攻克,而是没有一个明显的制约因素,是有各种小问题一点一点堆积起来,最终积重难返。

所以,把细节做好,或者意识到细节的地方可能引发的问题,对我们解决问题是很有帮助的,不要浪费了让你可以成长的细节。

有需要更多Android高级进阶和面试资料的朋友可以私信我获取

❹ android实现复杂table表格合并单元格

可以通过Tablelayout布局的layout_span属性实现,layout_span指定该单元格占据的列数

1、Tablelayout简介

Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。 当为View时,该View将独占一行。

2、TableLayout行列数的确定

TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或View控件),就有多少行。

TableLayout的列数等于含有最多子控件的TableRow的列数。如第一TableRow含2个子控件,第二个TableRow含3个,第三个TableRow含4个,那么该TableLayout的列数为4.

3、TableLayout可设置的属性详解

TableLayout可设置的属性包括全局属性及单元格属性。

单元格属性,有以下2个参数:

android:layout_column 指定该单元格在第几列显示

android:layout_span 指定该单元格占据的列数(未指定时,为1)

示例:

java">android:layout_column="1"该控件显示在第1列
android:layout_span="2"该控件占据2列

4、一个TableLayout布局的实例

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dip"
>
<!--1个TableLayout,用于描述表中单元格的属性,包括:android:layout_column及android:layout_span-->
<TextView
android:text="表:单元格设置:指定单元格属性设置"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="15sp"
android:background="#7f00ffff"/>
<TableLayout
android:id="@+id/table2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="3dip">
<TableRow>
<Buttonandroid:text="第0列"/>
<Buttonandroid:text="第1列"/>
<Buttonandroid:text="第2列"/>
</TableRow>

<TableRow>
<TextViewandroid:text="我被指定在第1列"android:layout_column="1"/>
</TableRow>

<TableRow>
<TextView
android:text="我跨1到2列,不信你看!"
android:layout_column="1"
android:layout_span="2"
/>
</TableRow>

</TableLayout>

❺ Android 布局优化之 ViewStub、 include、merge

文章、布局优化神器 include 、merge、ViewStub 标签详解

Tips:

include 标签使用:

//include_test.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:orientation="vertical">

<TextView

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="20dp"

android:text="@string/textview"

android:textSize="24sp"/>

<EditText

android:id="@+id/editText"

android:hint="@string/divide"

android:layout_width="300dp"

android:layout_height="wrap_content"/>

</LinearLayout>---------------------------------------------------------------

//include_text_relative

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

>

<TextView

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="20dp"

android:text="TextView_Relative"

android:textSize="24sp"/>

<EditText

android:id="@+id/editText"

android:layout_width="300dp"

android:layout_height="wrap_content"

android:layout_below="@+id/textView"

android:hint="@string/divide"/>

</RelativeLayout>

---------------------------------------------------------------

//include_toolbar.xml

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

<android.support.v7.widget.Toolbar

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:id="@+id/tb_toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:background="#00f"

app:theme="@style/AppTheme"

app:title="这是一个 ToolBar"app:titleTextColor="@android:color/white"/>

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

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

>

<!--测试 layout 和<include>都设置 ID 的情况-->

<include

android:id="@+id/tb_toolbar"

layout="@layout/include_toolbar"/>

<!--如果只有单个 include 这样写就可以,加载的布局的子 View,直接 findViewByID 就能找

到-->

<include layout="@layout/include_text"/>

<!--如果有多个 include,需要添加 ID 属性-->

<include

android:id="@+id/include_text1"

layout="@layout/include_text"/>

<!--这个 layout 用 RelativeLayout 实现-->

<!--如果要使用 layout_margin 这样的属性,要同时加上 layout_w/h 属性,不然没反应-->

<include

android:id="@+id/include_text2"

layout="@layout/include_text_relative"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="50dp"/>

</LinearLayout>

private void initView() {

//如果 include 布局根容器和 include 标签中的 id 设置的是不同的值,这里获取的

mToolbar 值将为 nullToolbar mToolbar = (Toolbar) findViewById(R.id.tb_toolbar);

setSupportActionBar(mToolbar);

//普通 include 标签用法,直接拿子 View 属性实现

TextView textView = (TextView) findViewById(R.id.textView);

textView.setText("不加 ID 实现的 include 标签");

//多个 include 标签用法,添加 ID,findViewByID 找到 layout,再找子控件

View view_include = findViewById(R.id.include_text1);

TextView view_include_textView = (TextView) view_include.findViewById(R.id.textView);

view_include_textView.setText("加了 ID 实现的 include 标签");

//多个 include 标签用法,添加 ID,findViewByID 找到 layout,再找子控件

View view_include_Relative = findViewById(R.id.include_text2);

TextView view_textView_relative =(TextView) view_include_Relative.findViewById(R.id.textView);

view_textView_relative.setText("加了 ID 实现的 include 标签(RelaviteLayout)");

}

include 标签 Demo 效果图

==include 使用注意==

merge标签主要用于辅助include标签,在使用include后可能导致布局嵌套过

多,多余的 layout 节点或导致解析变慢(可通过 hierarchy viewer 工具查看布

局的嵌套情况)官方文档说明:merge 用于消除视图层次结构中的冗余视图,例如根布局是

Linearlayout,那么我们又 include 一个 LinerLayout 布局就没意义了,反而会

减慢 UI 加载速度

merge 标签常用场景: .

根布局是 FrameLayout 且不需要设置 background 或 padding 等属性,可

以用merge代替,因为 Activity的 ContentView 父元素就是FrameLayout,

所以可以用 merge 消除只剩一个.

.某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,

这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中.

.自定义 View 如果继承 LinearLayout(ViewGroup),建议让自定义 View 的

布局文件根布局设置成 merge,这样能少一层结点.

.merge 标签使用:

在 XML 布局文件的根布局如 RelativeLayout 直接改成 merge 即可

merge 标签使用前后 Hierarchy Viewer 截图

FrameLayout 替换 merge 前

FrameLayout 替换 merge 后

include 标签对应 layout 根布局 替换 merge 前

include 标签对应 layout 根布局 替换 merge 后

==merge 使用注意==

ViewStub 标签最大的优点是当你需要时才会加载,使用它并不会影响 UI 初始

化时的性能.各种不常用的布局像进度条、显示错误消息等可以使用 ViewStub

标签,以减少内存使用量,加快渲染速度.ViewStub 是一个不可见的,实际上是把

宽高设置为 0 的 View.效果有点类似普通的 view.setVisible(),但性能体验提高

不少

第一次初始化时,初始化的是 ViewStub View,当我们调用 inflate()或

setVisibility()后会被 remove 掉,然后在将其中的 layout 加到当前 view

hierarchy 中

ViewStub 官方文档链接

//官方例子

<ViewStub

android:id="@+id/stub_import"

<!--android:inflateId:重写 ViewStub 的父布局控件的 Id-->

android:inflatedId="@+id/panel_import"

< <!--android:layout:设置 ViewStub 被 inflate 的布局-->

android:layout="@layout/progress_overlay"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="bottom" />

-------------------------------------------------//当你想加载布局时,可以使用下面其中一种方法:

((ViewStub)

findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);

// or

View importPanel = ((ViewStub)

findViewById(R.id.stub_import)).inflate();

判断 ViewStub(做单例)是否已经加载过:

1. 如果通过 setVisibility 来加载,那么通过判断可见性即可;

2. 如果通过 inflate()来加载,判断 ViewStub 的 ID 是否为 null 来判断

(findViewById(…))

public class ViewStubActivity extends AppCompatActivity

implements View.OnClickListener, ViewStub.OnInflateListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_stub);

}

private View networkErrorView;

private void showNetError() {

// not repeated infalte

if (networkErrorView != null) {

//setVisibility()方式加载布局,加载次数不限

networkErrorView.setVisibility(View.VISIBLE);

return;

}

//inflate()方式加载布局,只能加载一次

ViewStub stub = (ViewStub)

findViewById(R.id.network_error_layout);

stub.setOnInflateListener(this);networkErrorView = stub.inflate();

Button networkSetting = (Button)

networkErrorView.findViewById(R.id.network_miss);

networkSetting.setOnClickListener(this);

Button refresh = (Button)

findViewById(R.id.network_refresh);

refresh.setOnClickListener(this);

}

private void showNormal() {

if (networkErrorView != null) {

networkErrorView.setVisibility(View.GONE);

}

}

public void show(View view) {showNetError();

}

public void refresh(View view) {

showNormal();

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.network_miss:

Toast.makeText(this, "network_miss",

Toast.LENGTH_SHORT).show();

break;

case R.id.network_refresh:

Toast.makeText(this, "network_refresh",

Toast.LENGTH_SHORT).show();break;

}

}

/**

*

* @param stub 当前待 inflate 的 ViewStub 控件

* @param inflated 当前被 inflate 的 View 视图

*/

@Override

public void onInflate(ViewStub stub, View inflated) {

}

}

ViewStub 标签 Demo 效果图:

ViewStub 标签使用前后 Hierarchy Viewer 截图

ViewStub 标签使用前:

ViewStub 标签使用后:

==ViewStub 标签使用注意==

扩展:

Space 组件

在 ConstraintLayout 出来前,我们写布局都会使用到大量的 margin 或

padding,但是这种方式可读性会很差,加一个布局嵌套又会损耗性能

鉴于这种情况,我们可以使用space,使用方式和View一样,不过主要用来占位置,

不会有任何显示效果

❻ 请android四大组件是什么android常见合布局有哪些

Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider

在这些组件之间的通讯中,主要是由Intent协助完成的。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),
将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。

如果您认可我的答案,请点击下面的“选为满意回答”按钮,谢谢!

❼ android 如何把多个布局xml进行组合显示在一个界面中

private ViewGroup group;x0dx0aprivate ViewGroup main;x0dx0amain = (ViewGroup) inflater.inflate(R.layout.main, null);//这里的R。latout.main就是当前布局x0dx0agroup = (ViewGroup) main.findViewById(R.id.viewGroup);x0dx0a group.addView(imageViews[i]);//这样就把一个imageview(你可添加一个任意复杂的View,这个View实例化的时候指向你所谓的其他布局文件)加入当前布局中的某个ViewGroup里了,你布局时可定义一个LinearLayout id 设为(R.id.viewGroup),oratation设为垂直,放到下面就是了。

❽ android 表格布局如何合并跨行单元格

布局文件中android:numColumns="3"就表示每行显示3个,也就是3列,当然多少列就看你的条目有多少了,表格线好像没有这个属性,但可以设置每个元素之间的间距,水平:android:horizontalSpacing="2pt"和垂直android:verticalSpacing="2pt"如果要加水平分割线的话,直接用view控件加在每个条目的后面。

❾ 如何将两个android工程合并成一个项目,求具体步骤

如果有主次的话。。。

主项目,右键。点add,找到另外一个项目

阅读全文

与android合并布局相关的资料

热点内容
加密芯片的计算方法 浏览:187
手机存储为什么找不到微信文件夹 浏览:695
msf端口迁移命令 浏览:880
工商app积分怎么查询 浏览:143
铁路app怎么买火车票 浏览:309
移魅族除的app怎么添加 浏览:240
兔笼子大号加密 浏览:171
单片机程序烧录操作成功 浏览:878
指标高抛低吸点位源码 浏览:205
25匹压缩机铜管 浏览:570
单片机单灯左移05 浏览:150
买服务器练手什么配置 浏览:783
服务器被毁该怎么办 浏览:939
python私有库 浏览:514
Python有中文吗 浏览:736
麦块的服务器为什么都进不去 浏览:474
新买的服务器如何打开 浏览:35
安卓软件游戏怎么开发 浏览:319
用扑克摆爱心解压神器怎么摆 浏览:70
松下制冷压缩机 浏览:275