XML 레이아웃 에서 Android 태그 의 목적은 무엇입니까?
로메인 가이가 인터넷에 올린 글을 읽어봤습니다.<merge />
태그를 달았지만, 그게 어떻게 유용한지는 아직도 잘 모르겠어요.그것은 그들을 대체하기 위한 것일까요?<Frame />
tag,요:tag,g?
<merge xmlns:android="....">
<LinearLayout ...>
.
.
.
</LinearLayout>
</merge>
그리고나서<include />
다른 파일에 있는 코드?
<merge/>
불필요한 ViewGroups(즉, 다른 보기를 래핑하는 데 사용되는 레이아웃)를 제거할 수 있기 때문에 유용합니다.
를 들어, 당신이 이, <include/>
merge를 파일의 하면 두 과 같이 보일 수 .
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
기능적으로 이 단일 레이아웃과 동등합니다.
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
layout2.xml의 해당 FrameLayout은 유용하지 않을 수 있습니다.<merge/>
그것을 없애는 데 도움이 됩니다.되지 않음 merge는를과다음 (layout1.xml지은은음지yee(e(g'은tsls과은tt
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
이는 다음 레이아웃과 기능적으로 동등합니다.
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
하지만 당신이 사용하고 있기 때문에.<include/>
다른 곳에서 레이아웃을 재사용할 수 있습니다.프레임 레이아웃만 교체하는 데 사용할 필요는 없습니다. 보기의 모양/동작에 유용한 내용을 추가하지 않는 레이아웃을 교체하는 데 사용할 수 있습니다.
포함 태그
태그를 사용하면 여러 파일로 레이아웃을 분할할 수 있습니다. 복잡하거나 너무 긴 사용자 인터페이스를 처리하는 데 도움이 됩니다.
다음과 같이 두 개의 포함 파일을 사용하여 복잡한 레이아웃을 분할한다고 가정합니다.
top_level_activity.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<include layout="@layout/include1.xml" />
<!-- Second include file -->
<include layout="@layout/include2.xml" />
</LinearLayout>
그럼 글을 써야겠네요.include1.xml
그리고.include2.xml
.
include files의 xml은 단순히 당신의top_level_activity
시간의 (layout) 에웃어다과링y)ee과를(웃t,어th에)#INCLUDE
C)의 매크로를 사용합니다.
포함 파일은 플레인 제인 레이아웃 xml 입니다.
include 1.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
... 2를 포함합니다.xml:
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
android:text="Button" />
보셨죠? 화려한 건 아닙니다.히드과이야다를다 선언해야 합니다.xmlns:android="http://schemas.android.com/apk/res/android
.
top_level_activity.xml의 렌더링 버전은 다음과 같습니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
이 것은합니다: 에서는 합니다 이 합니다 이 에서는 .findViewById(R.id.textView1)
활동 클래스에서 올바른 위젯을 반환합니다(해당 위젯이 활동 레이아웃과 다른 xml 파일로 선언된 경우에도).
그리고 맨 위에 체리가 있습니다. 시각 편집자는 그것을 유유히 다루죠.최상위 레벨 레이아웃은 xml이 포함된 상태로 렌더링됩니다.
사건의 가닥이 복잡해지는데.
포함 파일은 고전적인 레이아웃 xml 파일이므로 상위 요소가 하나 있어야 합니다.따라서 파일에 둘 이상의 위젯이 포함되어야 하는 경우에는 레이아웃을 사용해야 합니다.
라고 합시다.include1.xml
지금은 두개가 있습니다TextView
. 레이아웃을 선언해야 합니다.해요를 LinearLayout
.
include 1.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
top_level_activity.xml은 다음과 같이 렌더링됩니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
하지만 두 단계의 단계가 중복됩니다!
두 의 중첩된 , 의 된 LinearLayout
가지 목적을 할 수 .TextView
될수다다수relayout1
정확히 같은 렌더링을 위해.
그래서 우리는 무엇을 할 수 있을까요?
병합 태그 입력
<merge>
태그는 이런 종류의 중복 문제를 처리하기 위한 상위 레벨 요소를 제공하는 더미 태그일 뿐입니다.
이제 include 1.xml은 다음과 같습니다.
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</merge>
이제 top_level_activity.xml은 다음과 같이 렌더링됩니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
계층 레벨 하나를 저장했습니다. 쓸모없는 보기 하나를 피하십시오. 로맹 가이는 이미 잠을 더 잘 잡니다.
지금이 더 행복하지 않습니까?
블레이저로니는 이미 분명히 했습니다. 몇 가지 사항만 덧붙이고 싶습니다.
<merge>
레이아웃을 최적화하는 데 사용됩니다.불필요한 네스팅을 줄이기 위해 사용됩니다.- Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ
<merge>
는 다른는른에다됩니다에 됩니다.<merge>
노드가 제거되고 해당 자식 보기가 새 부모에 직접 추가됩니다.
저는 무슨 일이 일어나고 있는지 좀 더 깊이 알기 위해 다음과 같은 예시를 만들었습니다.activity_main.xml 및 content_profile.xml 파일을 살펴봅니다.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/content_profile" />
</LinearLayout>
content_profile.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Howdy" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hi there" />
</LinearLayout>
여기서 전체 레이아웃 파일은 부풀려진 상태에서 이렇게 보입니다.
<LinearLayout>
<LinearLayout>
<TextView />
<TextView />
</LinearLayout>
</LinearLayout>
상위 선형 레이아웃 내부에 선형 레이아웃이 있으며 이는 어떤 용도로도 사용되지 않으며 중복됩니다.Layout Inspector 도구를 통해 레이아웃을 살펴보면 이를 명확하게 설명할 수 있습니다.
LinearLayout과 같은 ViewGroup 대신 merge를 사용하도록 코드를 업데이트한 후 content_profile.xml.
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Howdy" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hi there" />
</merge>
이제 저희 레이아웃이 이렇게.
<LinearLayout>
<TextView />
<TextView />
</LinearLayout>
여기에서 중복 LinearLayout ViewGroup이 제거되었습니다.이제 Layout Inspector 도구는 다음과 같은 레이아웃 계층 구조를 제공합니다.
따라서 부모 레이아웃이 자식 레이아웃을 배치할 수 있는 경우에는 항상 병합을 사용하거나 계층에 중복 뷰 그룹이 있을 것으로 예상되는 경우에는 보다 정확하게 병합을 사용합니다.
병합을 사용하는 또 다른 이유는 ListViews 또는 GridViews에서 사용자 정의 뷰 그룹을 사용하는 경우입니다.보기를 사용하는 대신목록 어댑터의 홀더 패턴, 사용자 지정 뷰를 사용할 수 있습니다.사용자 지정 보기는 루트가 병합 태그인 xml을 부풀립니다.어댑터 코드:
public class GridViewAdapter extends BaseAdapter {
// ... typical Adapter class methods
@Override
public View getView(int position, View convertView, ViewGroup parent) {
WallpaperView wallpaperView;
if (convertView == null)
wallpaperView = new WallpaperView(activity);
else
wallpaperView = (WallpaperView) convertView;
wallpaperView.loadWallpaper(wallpapers.get(position), imageWidth);
return wallpaperView;
}
}
사용자 지정 뷰 그룹은 다음과 같습니다.
public class WallpaperView extends RelativeLayout {
public WallpaperView(Context context) {
super(context);
init(context);
}
// ... typical constructors
private void init(Context context) {
View.inflate(context, R.layout.wallpaper_item, this);
imageLoader = AppController.getInstance().getImageLoader();
imagePlaceHolder = (ImageView) findViewById(R.id.imgLoader2);
thumbnail = (NetworkImageView) findViewById(R.id.thumbnail2);
thumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
public void loadWallpaper(Wallpaper wallpaper, int imageWidth) {
// ...some logic that sets the views
}
}
XML은 다음과 같습니다.
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/imgLoader"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:src="@drawable/ico_loader" />
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
안드로이드 공식 문서를 기반으로 당신은 오직 사용해야 합니다.merge
대신에FrameLayout
만약 그것이 아무것도 제공하지 않는다면padding
아니면margin
기타.
견적:
루트 프레임 병합 - 프레임 레이아웃이 레이아웃의 루트이고 배경이나 패딩 등을 제공하지 않는 경우 약간 더 효율적인 병합 태그로 대체할 수 있습니다.
언급URL : https://stackoverflow.com/questions/8834898/what-is-the-purpose-of-androids-merge-tag-in-xml-layouts
'programing' 카테고리의 다른 글
값을 잘라내지 않고 Format-Table을 사용하려면 어떻게 해야 합니까? (0) | 2023.09.13 |
---|---|
우커머스, 배송 클래스 기준 배송 방법 숨김 (0) | 2023.09.13 |
div에서 클래스의 첫 번째 출현을 찾습니다. (0) | 2023.09.13 |
자바스크립트로 팝업을 열고 사용자가 언제 닫는지 감지할 수 있습니까? (0) | 2023.09.13 |
iFrame이 로딩될 때 로딩 메시지를 표시하는 방법? (0) | 2023.09.13 |