programing

XML 레이아웃에서 Android 태그의 목적은 무엇입니까?

muds 2023. 9. 13. 23:59
반응형

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에)#INCLUDEC)의 매크로를 사용합니다.

포함 파일은 플레인 제인 레이아웃 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.xmlcontent_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 도구를 통해 레이아웃을 살펴보면 이를 명확하게 설명할 수 있습니다.

enter image description here

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 도구는 다음과 같은 레이아웃 계층 구조를 제공합니다.

enter image description here

따라서 부모 레이아웃이 자식 레이아웃을 배치할 수 있는 경우에는 항상 병합을 사용하거나 계층에 중복 뷰 그룹이 있을 것으로 예상되는 경우에는 보다 정확하게 병합을 사용합니다.

병합을 사용하는 또 다른 이유는 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

반응형