導航:首頁 > 操作系統 > 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