Androidレイアウトの「merge」タブの目的は何ですか?
I've read Romain Guy's post on the
tag, but I still don't understand how it's useful. 私はすでに
のラベルでRomain Guyの投稿を読んだが、それがどのように役に立つのかまだ分からない.Is it a sort-of replacement of the
tag,or is it used like so:
ラベルの代替品なのか、それともこのように使用されているのか.
.
.
.
then
the code in another file? では、
コードは別のファイルにありますか?1階
参照先:https://stackoom.com/question/B4mm/Androidレイアウトの-merge-ラベルの目的は何ですか?
2階
is useful because it can get rid of unneeded ViewGroups, ie layouts that are simply used to wrap other views and serve no purpose themselves.
は、不要なViewGroup、すなわち、他のビューを包装するために簡単に使用され、それ自体が用途のないレイアウトから抜け出すことができるため、有用である.For example,if you were to
a layout from another file without using merge,the two files might look something like this:たとえば、マージを使用せずに別のファイル
からレイアウトすると、この2つのファイルは次のようになります.layout1.xml: layout1.xml:
layout2.xml: layout2.xml:
which is functionally equivalent to this single layout:これは機能的にこの単一レイアウトに等しい:
That FrameLayout in layout2.xml may not be useful. layout2.xmlのFrameLayoutは役に立たないかもしれません.
helps get rid of it.
はそれから抜け出すのに役立ちます.Here's what it looks like using merge(layout 1.xml doesn't change):これはmergeを使用して見える様子です(layout 1.xmlは変わりません):layout2.xml: layout2.xml:
This is functionally equivalent to this layout:これは機能的にこのレイアウトと同等です.
but since you are using
you can reuse the layout elsewhere. ただし、
を使用しているため、レイアウトを他の場所で繰り返し使用できます.It doesn't have to be used to replace only FrameLayouts - you can use it to replace any layout that isn't adding something useful to the way your view looks/behaves. FrameLayoutsのみを置き換える必要はありません.これを使用して、ビューの外観/動作に役立つコンテンツが追加されていないレイアウトを置き換えることができます.#3階
blazeroni already made it pretty clear, I just want to add few points. blazeroniはもうはっきり言っていますが、いくつか補充したいだけです.
is used for optimizing layouts.It is used for reducing unnecessary nesting.
は、レイアウトを最適化するために使用されます.不要なネストを減らすために使用されます.
tag is added into another layout,the
node is removed and its child view is added directly to the new parent.
タグを含むレイアウトが別のレイアウトに追加されると、
ノードが削除され、サブビューが新しい親に直接追加されます.#4階
The include tagにはラベルが含まれています
The
tag lets you to divide your layout into multiple files: it helps dealing with complex or overlong user interface.
ラベルを使用すると、レイアウトを複数のファイルに分割できます.これにより、複雑または長すぎるユーザーインタフェースの処理に役立ちます.Let's suppose you split your complex layout using two include files as follows:次のように、ファイルを含む2つの複雑なレイアウトを分割するとします.
top_level_activity.xml : top_level_activity.xml :
Then you need to write
include1.xml
and include2.xml
. include1.xml
とinclude2.xml
を書く必要がありますKeep in mind that the xml from the include files is simply dumped in your
top_level_activity
layout at rendering time (pretty much like the #INCLUDE
macro for C). ファイルを含むxmlは、レンダリング時にtop_level_activity
レイアウトに簡単にダンプされることを覚えておいてください(Cの#INCLUDE
マクロと非常に似ています).The include files are plain jane layout xml. includeファイルはplain jane layout xmlです.
include1.xml : include1.xml :
... and include2.xml : ...およびinclude 2.xml :
See? 看到? Nothing fancy. 没有什么花哨。 Note that you still have to declare the android namespace with xmlns:android="http://schemas.android.com/apk/res/android
. 请注意,您仍然需要使用xmlns:android="http://schemas.android.com/apk/res/android
声明android命名空间xmlns:android="http://schemas.android.com/apk/res/android
。
So the rendered version of top_level_activity.xml is: 所以top_level_activity.xml的渲染版本是:
In your java code, all this is transparent: findViewById(R.id.textView1)
in your activity class returns the correct widget ( even if that widget was declared in a xml file different from the activity layout). 在您的Java代码中,所有这些都是透明的:活动类中的findViewById(R.id.textView1)
返回正确的窗口小部件(即使该窗口小部件在与活动布局不同的xml文件中声明)。
And the cherry on top: the visual editor handles the thing swimmingly. 顶上的樱桃: 视觉编辑器游戏地处理这件事。 The top level layout is rendered with the xml included. 顶级布局使用包含的xml进行渲染。
The plot thickens 情节变粗
As an include file is a classic layout xml file, it means that it must have one top element. 由于包含文件是经典布局xml文件,因此它必须具有一个顶部元素。 So in case your file needs to include more than one widget, you would have to use a layout. 因此,如果您的文件需要包含多个小部件,则必须使用布局。
Let's say that include1.xml
has now two TextView
: a layout has to be declared. 让我们说include1.xml
现在有两个TextView
:必须声明一个布局。 Let's choose a LinearLayout
. 我们选择一个LinearLayout
。
include1.xml : include1.xml :
The top_level_activity.xml will be rendered as: top_level_activity.xmlは次のように表示されます.
But wait the two levels of LinearLayout
are redundant ! 但等待LinearLayout
的两个级别是多余的 !
Indeed, the two nested LinearLayout
serve no purpose as the two TextView
could be included under layout1
for exactly the same rendering . 实际上,两个嵌套的LinearLayout
没有用处,因为两个TextView
可以包含在layout1
下,用于完全相同的渲染 。
So what can we do? 所以,我们能做些什么?
Enter the merge tag 输入合并标记
The
tag is just a dummy tag that provides a top level element to deal with this kind of redundancy issues.
标记只是一个虚拟标记,它提供了一个顶级元素来处理这种冗余问题。
Now include1.xml becomes: 现在include1.xml变为:
and now top_level_activity.xml is rendered as:現在top_level_activity.xmlは次のように表示されます.
You saved one hierarchy level, avoid one useless view: Romain Guy sleeps better already. 您保存了一个层次结构级别,避免一个无用的视图:Romain Guy已经睡得更好了。
Aren't you happier now? 你现在不开心吗?
#5楼
Another reason to use merge is when using custom viewgroups in ListViews or GridViews. 使用合并的另一个原因是在ListViews或GridViews中使用自定义视图组。 Instead of using the viewHolder pattern in a list adapter, you can use a custom view. 您可以使用自定义视图,而不是在列表适配器中使用viewHolder模式。 The custom view would inflate an xml whose root is a merge tag. 自定义视图会膨胀其根是合并标记的xml。 Code for adapter: 适配器代码:
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;
}
}
here is the custom viewgroup:カスタムビューグループです.
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
}
}
and here is the XML:XMLです.
#6階
To have a more in-depth knowledge of what's happening, I created the following example. 発生していることをより深く理解するために、以下の例を作成しました.Have a look at the activity_main.xml and content_profile.xml files. Activity_の表示main.xmlとcontent_profile.xmlファイル.
activity_main.xml activity_main.xmlで
content_profile.xml content_profile.xml
In here, the entire layout file when inflated looks like this. ここで、空気を入れるとレイアウトファイル全体がこのように見えます.
See that there is a LinearLayout inside the parent LinearLayout which doesn't serve any purpose and is redundant. 親LinearLayoutの中にLinearLayoutがあり、何の目的もなく余計なものです.A look at the layout through Layout Inspector tool clearly explains this. この点はLayout Inspectorツールでレイアウトを確認することによって明確に説明されています.
content_profile.xml after updating the code to use merge instead of a ViewGroup like LinearLayout. LinearLayoutのようなViewGroupの後のcontent_ではなくmergeを使用するためにコードを更新します.profile.xml .
今のレイアウトはこんな感じ
Here we see that the redundant LinearLayout ViewGroup is removed. ここでは、冗長なLinearLayout ViewGroupが削除されていることを示します.Now Layout Inspector tool gives the following layout hierarchy. レイアウトインスペクタツールでは、次のレイアウト階層を使用できます.
So always try to use merge when your parent layout can position your child layouts, or more precisely use merge when you understand that there is going to be a redundant view group in the hierarchy. したがって、親レイアウトでサブレイアウトを配置できる場合は、常にマージを使用してみてください.または、階層に冗長ビューグループが存在することを理解している場合は、マージをより正確に使用してください.