0717-7821348
关于我们

彩票365官网app

您现在的位置: 首页 > 关于我们 > 彩票365官网app
自从用了Android Tools,我再也没加过班
2019-12-14 22:12:58

码个蛋(codeegg)第 769 次推文

作者: 水月沐风

原文: https://自从用了Android Tools,我再也没加过班juejin.im/post/5d500b1a6fb9a06b1417d5c9

前语

日常开发过程中,咱们都会遇到这样一种场景:咱们写出的 UI 作用在对接数据之前需求提早进行预览,从而调整 UI 细节和排版问题。咱们一般的做法是什么样的?

假如存在像 TextView 或许 ImageView 这种根底控件,你是不是还在经过比方

android:text="xxx"android:src="@drawable/xxx"的办法来测验和预览UI作用?当然你必定也会遇到这些“脏数据”给你带来的困扰:测验的时分某些当地呈现了本不应呈现的数据,过后或许一拍脑门才发现,原来是布局中控件预览数据没有铲除导致的。

假如是 RecyclerView,在后台接口尚能测验的情况下,你是否又要自己生成“假数据”并手写 Adapter 呢?这时分你不由会问:有没有一种办法,既能够做到布局时预览数据便利排版,又能够在对接实在数据运转后动态替换和移除这些无关数据呢?

铛铛铛铛!Android 的 Tools attributes应运而生。

老规矩,咱们先来看一个作用:

What?你在耍我吗?这么简略的列表拿出来干嘛?哈哈,客观不要着急。这个并不难完成,假使我说这儿并没有写一行 Java 或许 Kotlin 代码就完成了此作用,而仅仅在布局页面预览,你敢信吗?上图仅仅冰山一角,下面这张图才是全貌:

下面会带咱们一步步完成上述功用,首要,让咱们从头说起。

知道 Tools attributes

Tools attributes 即以 tools开端的命名空间,举个咱们最常见到的比方:

 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

咱们必定平常都会见到 tools:context=".XXXActivity" 这个体系默认为咱们生成的装备。一般来说,只要根视图才干运用这个特点,它指定了当时布局默许是与哪个 Activity 相关联,使得布局能够获取到绑定 Activity 的一些信息,比方 Theme 等等,并且当你在布局中给子 View 增加 onClick事情时,相应的办法代码会刺进到这个 Activity 中。Android studio 支撑很多在 XML 文件中以 tools 为命名空间的特点,当构建 App 时这些特点自从用了Android Tools,我再也没加过班会被擦除,对 APK 的巨细和运转时行为没有任何影响,这也便是咱们文章开始想要的成果。

细说 Tools attributes

在详细介绍 Tools attributes 之前,咱们需求先了解怎么引进 Tools 的命名空间并运用,很简略,只需求在 XML 布局文件的根元素中增加即可:


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

这些东西特点大约能够分为以下三类:

1. Error handling attributes

即过错和正告处理特点。

这类特点常被用来躲避被 lint检查出的一些过错提示以及正告。下面让咱们看一些常见的比方:

1.1 tools:ignore

首要用来疏忽一些 lint 发生的正告信息,并支撑一些特点,例如:

http://schemas.android.com/tools"> app_name">ConstraintSample issingTranslation">header image

这个关于 Android studio 升级到 3.0 以上的小伙伴来说应该是很常见了,假如咱们项目中涉及到国际化支撑,那么编译器就会提示咱们为每一种言语做适配,不能“另眼相看”,假如咱们某些 string 只需求支撑一种言语,只需求像上面那样增加 tools:ignore="MissingTranslation即可。

相似的比方还能够在运用 ImageView 的时分看到:

 android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_person_off" tools:ignore="contentDescription" />

1.2 tools:targetApi

这个特点的功用和 Java 代码中的注解 @TargetApi是相同的:它指定了当时控件或元素支撑的 API 等级,特点值能够是 API Code 名或许 API 常数值,它支撑全部特点。如:咱们都知道,android:elevation特点是在 API 21 版别以上才支撑的,所以咱们能够经过以下代码躲避 lint的正告:

 android:layout_width="wrap_content" android:layout_height="wrap_content" android:elevation="4dp" tools:targetApi="lollipop"/>

1.3 tools:locale

这个特点首要用在 标签内,用来指定当时资源中默认为哪种言语和区域,从而躲避言语拼写的检测,比方你能够指定 values/strings.xml文件的默许言语是西班牙语而不是英语:

http://schemas.android.com/tools" tools:locale="es">

2. Resource shrinking attributes

即资源紧缩特点。下面简略阐明一下。

咱们能够经过 tools:shrinkMode 和 tools:keep 特点来别离指定资源紧缩的方式和需求保存的不被紧缩的资源 ,还能够经过 tools:discard特点来指定需求保存的资源,与 keep功用相似:

http://schemas.android.com/tools" tools:shrinkMode="strict"  tools:keep="@layout/activity_video*,@layout/dialog_update_v2" tools:discard="@layout/unused_layout,@drawable/unused_selector" />

下面就到本篇文章的重头戏了,留意,前方高能来袭!

3. Design-time View Attributes

这便是咱们从前作用图中的重要功臣了,即:布局设计时的控件特点。这类特点首要作用于 View 控件,如上文所说的 tools:context 便是“成员”之一,下面咱们来介绍其他重要成员。

在此之前,咱们需求先揭开 tools 命名空间的另一层奥秘面纱:tools:能够替换任何故 android:为前缀的特点,并为其设置样例数据(sample data)。当然,正如咱们前面所说,tools 特点只能在布局修改期间有用,App真实运转后就毫无意义了,所以,咱们就能够像下面这样来在运转前预览布局作用:

上图对应的布局文件为:

Card_item_layout.xml


 xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:background="@android:color/white" android:clickable="true" android:focusable="true" android:foreground="?attr/selectableItemBackground" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="2dp" android:layout_marginEnd="2dp" tools:targetApi="m" tools:ignore="UnusedAttribute">
android:id="@+id/card_item_avatar" android:layout_width="38dp" android:layout_height="38dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="16dp" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp" app:layout_constraintVertical_bias="0.0" tools:ignore="ContentDescription" tools:srcCompat="@drawable/user_other"/> android:id="@+id/card_item_username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="@+id/card_item_title" app:layout_constraintEnd_toEndOf="@+id/card_item_title" app:layout_constraintHorizontal_bias="0.0" android:textSize="12sp" android:textColor="@color/username_text_color" android:layout_marginEnd="16dp" android:paddingEnd="16dp" tools:text="水月沐风" /> android:id="@+id/card_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="@color/title_text_color" app:layout_constraintStart_toEndOf="@+id/card_item自从用了Android Tools,我再也没加过班_avatar" android:layout_marginStart="12dp" app:layout_constraintTop_toBottomOf="@+id/card_item_username" android:layout_marginTop="8dp" android:maxLines="1" tools:text="今日上海的夜色真美!"/> android:id="@+id/card_item_content" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="24dp" app:layout_constraintTop_toBottomOf="@+id/card_item_avatar" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp" app:layout_constraintVertical_bias="1.0" android:maxLines="3" android:ellipsize="end" android:textColor="@color/content_text_color" android:textStyle="normal" app:layout_constraintEnd_toEndOf="@+id/card_item_bottom_border" android:layout_marginEnd="16dp" android:layout_marginStart="16dp" app:layout_constraintHorizontal_bias="0.0" tools:text="人生若只如初见,何事秋风悲画扇..."/> android:id="@+id/card_item_poster" android:layout_width="0dp" android:layout_height="200dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/card_item_content" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" android:scaleType="centerCrop" android:layout_marginTop="8dp" android:layout_marginStart="16dp" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp" app:layout_constraintVertical_bias="0.0" tools:ignore="ContentDescription" android:visibility="visible" tools:src="@drawable/shanghai_night"/> android:id="@+id/card_item_bottom_border" android:layout_width="0dp" android:layout_height="2dp" app:layout_constraintTop_toBottomOf="@+id/card_item_poster" android:background="#ffededfe" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent"/> android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/card_item_date" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" android:textColor="@color/date_text_color" android:textSize="12sp" tools:text="2019-08-10"/>

经过上面代码咱们能够发现:经过 对 TextView运用tools:text特点代替android:text就能够完成文本详细作用的预览,可是这项设置并不会对咱们 App 实践运转作用发生影响。

同理,经过将 tools:src作用于ImageView也能够到达预览图片的作用。

此外,咱们还能够对其他以 android:为前缀的特点进行预览而不影响实践运转的作用,例如:上面布局代码中的底部分割线,咱们想将其在 App 实践运转的时分躲藏掉,但咱们仍是需求知道它的预览作用和所占高度:

 android:id="@+id/card_item_bottom_border" android:layout_width="0dp" android:layout_height="2dp" android:visibility="gone" tools:visibility="visible" tools:layout_height="8dp" app:layout_constraintTop_toBottomOf="@+id/card_item_poster" android:background="#ffededfe" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent"/>

如上所示,经过 tools:visibility 和 tools:layout_height 就能够仅在布局预览情况下改动 View 的状况和高度。尽管上述情况比较少用,可是期望咱们也能够知道,tools: 能够代替一切 android: 润饰的特点。

下面再罗列一些其他会常用到的特点。

  • tools:layout

    这个特点只能用于 fragment控件中,

    假如咱们的 activity布局文件中声明晰 控件,咱们就能够经过 tools:layout=”@layout/fragment_main”来在当时 activity布局中预览 fragment中的布局作用。

  • tools:showIn

    这个特点就比较好玩了,它能够指定其他布局文件像 组件相同在当时布局文件中运用和预览 控件的实践作用。

    例如,咱们 car花冠d_item_layout.xml 作为 showIn的目标给 show_in_layout.xml 布局运用,然后我就能够看到 show_in_layout.xml 中如下作用:

  • tools:menu

    这个特点能够给当时布局预览器的 Toolbar 增加多个菜单项,但仅限于布局文件的根节点元素。如:


http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:menu="menu1,menu2" />
  • tools:maxValue | tools:minValue

    这两个特点仅用于 ,能够在预览时指定其最大值和最小值:

     xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/numberPicker" android:layout_width="match_parent" android:layout_height="wrap_content" tools:minValue="0" tools:maxValue="10" />
  • tools:listitem | tools:listheader | tools:listfooter | tools:listCount

    下面来讲一下列表相关组件的 tools 特点。

    上面四个特点仅用于 及其子类(如:ListView和 RecyclerView)。可是,它们内部仍有一些运用约束:tools:listCount仅用于 RecyclerView;tools:listheader和 tools:listfooter仅限于 ListView;至于 tools:listitem特点二者皆可用。之前的作用图便是凭借于此特点:

activity_main.xml:

 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:background="#ffEBEBEF">  android:id="@+id/toolbar" android:layout_width="0dp" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:theme="?attr/actionBarTheme" android:minHeight="?attr/actionBarSize" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:elevation="1dp" app:title="@string/app_name" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.0"/>  android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:scrollbars="vertical" app:layout_constraintTop_toBottomOf="@+id/toolbar" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintVertical_bias="0.0" tools:listitem="@layout/card_item_layout"/>

sample data

即 样本数据功用,能够经过 @tools:sample 来运用该特点,也归于 design-time view attributes。但它并非仅仅一个特点那么简略,更应该算是一个“东西利器”,所以会将其独自拿出来详细介绍。这个东西是本年度 Google 大会上 Android 开发团队特别介绍的一个新推特点。它有什么用呢?用途大了!从前的布局预览运用的数据都是咱们直接在布局控件中注明或许在 strings.xml文件中给出的,这一就会发生一些脏数据,不利于咱们后期的处理。而有了 sample data,咱们就能够对布局预览器中的 **“样本数据”**进行会集保存和管理了。

一、sample data 的运用

Android studio已为咱们供给了以下样本数据,我能够直接拿来运用:





Attribute valueDescription of placeholder data
@tools:sample/full_namesFull names that are randomly generated from the combination of@tools:sample/first_namesand@tools:sample/last_names.
@tools:sample/first_namesCommon first names.
@tools:sample/last_namesCommon last names.
@tools:sample/citiesNames of cities from across the world.
@tools:sample/us_zipcodesRandomly generated US zipcodes.
@tools:sample/us_phonesRandomly generated phone numbers with the following format: (800) 555-xxxx.
@tools:sample/loremPlaceholder text that is derived from Latin.
@tools:sample/date/day_of_weekRandomized dates and times for the specified format.
@tools:sample/date/ddmmyy
@tools:sample/date/mmddyy
@tools:sample/date/hhmm
@tools:sample/date/hhmmss
@tools:sample/avatarsVector drawables that you can use as profile avatars.
@tools:sample/backgrounds/scenicImages that you can use as backgrounds.

上述表格中不只有常用文本数据和日期等数据,还供给了一些图片样本数据,那么该怎么运用呢?很简略,只需求切换到布局预览界面,并拖动一个 ImageView到面板上,然后 Android studio 就会弹出如下界面:

然后挑选 avatars或许 background/scenic数据源就能够了。当然你也能够经过 xml代码方式来设置:

 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@android:color/white" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_p自从用了Android Tools,我再也没加过班arent" android:layout_height="match_parent">
android:layout_width="36dp" android:layout_height="36dp" android:id="@+id/imageView" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="16dp" tools:srcCompat="@tools:sample/avatars"/> android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/textView" app:layout_constraintStart_toEndOf="@+id/imageView" android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/lorem/random" tools:maxLines="8" android:ellipsize="end" android:textSize="14sp" android:textColor="@color/title_color" android:layout_marginTop="16dp" app:layout_constraintHorizontal_bias="0.0"/>

同样地,TextView也能够经过 @tools:sample/lorem/random来增加样本数据,如此一来,作用如下:

哈哈,还不错吧。那么问题来了,假如咱们想要用自己的样本数据源呢?

二、自定义 sample data

假如咱们想要是用自己定制化的样例数据,该怎么做呢?其实很简略,只需求在 app目录下创立 sample data directory就能够了:

接下来,咱们就能够在里面定制咱们自己的数据了,在刚建好的 sampledata目录下新建一个 txt格局的数据文件,如 users,然后在里面创立如下数据:

如此这般,同理创立咱们的其他数据: titles、descriptions,然后在上述 card_item_layout.xml布局文件中替换并运用自己的数据源:

 android:id="@+id/card_item_username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="@+id/card_item_title" app:layout_constraintEnd_toEndOf="@+id/card_item_title" app:layout_constraintHorizontal_bias="0.0" android:textSize="12sp" android:textColor="#8989ae" android:layout_marginEnd="16dp" android:paddingEnd="16dp" tools:text="@sample/users" />

这儿仅以其间一个 TextView举例阐明,其他同理。

什么?你认为到这儿就讲完了?哈哈,少年,看你骨骼惊讶,再教你一招来上天入地:经过自定义 Json 格局的 数据来为控件绑定数据:

打完收工,仍是上面的比方,来看看怎么经过 json数据来绑定:

 android:id="@+id/card_item_username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="@+id/card_item_title" app:layout_constraintEnd_toEndOf="@+id/card_item_title" app:layout_constraintHorizontal_bias="0.0" android:textSize="12sp" android:textColor="#8989ae" android:layout_marginEnd="16dp" android:paddingEnd="16dp" tools:text="@sample/sample.json/data/username" />

以上操作的时分 Android studio 都会主动提示 sampledata途径下的数据文件,Json 格局亦会提示到详细字段。

最终

从 Google Android 官方的进一步意向来看,后续Android更新过程中,布局修改器将愈加强壮。

从 Tools attributes 到 ConstraintLayout1.1 再到行将到来的 ConstraintLayout2.0 中的 MotionLayout,能够预见:Android 将在 UI 烘托和动画完成方面进一步解放咱们的双手。