Android Studio中如何在不同约束布局复用同一份Guideline
如何在多个Android布局中复用ConstraintLayout的Guideline?
我在开发Android Studio Java应用的UI时,用Guideline约束布局元素(比如app:layout_constraintEnd_toStartOf="@+id/vButtonGuidelineEnd"),想在不同布局里复用相同的Guideline当作统一边距,避免重复写相同的Guideline代码。现在每次重复创建都得用不同ID,完全没必要。找了很多资料,都只讲单布局内的Guideline用法。
我试过把通用Guideline放到单独的guidelines.xml约束布局里,再用<include>引入其他布局,但引入后它是独立块,没法访问内部的Guideline,也就没法把其他元素约束到这些Guideline上。
我的guidelines.xml原代码:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/guidelinesLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.Guideline android:id="@+id/vButtonGuidelineStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.2" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/vButtonGuidelineEnd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.8" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/hIconGuidelineStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.05" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/hIconGuidelineEnd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3" /> </androidx.constraintlayout.widget.ConstraintLayout>
我希望在其他布局里直接复用这些Guideline,比如像下面这样约束TextView:
<TextView android:id="@+id/textViewAppName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:textAppearance="@style/LargeTextAppearance" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/hIconGuidelineEnd" app:layout_constraintVertical_bias="0.0" />
可行方案
方案1:用<merge>标签重构Guideline布局
把guidelines.xml的根布局改成<merge>,这样引入时Guideline会直接合并到父布局中,就能直接引用它们的ID了。
修改后的guidelines.xml:
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.constraintlayout.widget.Guideline android:id="@+id/vButtonGuidelineStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.2" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/vButtonGuidelineEnd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.8" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/hIconGuidelineStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.05" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/hIconGuidelineEnd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.3" /> </merge>
然后在目标布局中引入并使用:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 引入通用Guideline --> <include layout="@layout/guidelines" /> <!-- 直接引用Guideline的ID(注意不要加+,因为ID已定义) --> <TextView android:id="@+id/textViewAppName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:textAppearance="@style/LargeTextAppearance" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.494" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/hIconGuidelineEnd" app:layout_constraintVertical_bias="0.0" /> </androidx.constraintlayout.widget.ConstraintLayout>
方案2:用资源文件统一管理Guideline百分比
如果只是想统一Guideline的百分比参数,不想重复写数值,可以把这些值定义在values/dimens.xml中:
<resources> <item name="guideline_v_button_start" format="float" type="dimen">0.2</item> <item name="guideline_v_button_end" format="float" type="dimen">0.8</item> <item name="guideline_h_icon_start" format="float" type="dimen">0.05</item> <item name="guideline_h_icon_end" format="float" type="dimen">0.3</item> </resources>
之后在每个布局的Guideline里直接引用这些资源:
<androidx.constraintlayout.widget.Guideline android:id="@+id/vButtonGuidelineStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="@dimen/guideline_v_button_start" />
这种方法虽然还是要在每个布局里写Guideline,但参数是统一的,修改时只需要改dimens.xml即可。
内容的提问来源于stack exchange,提问作者Javier Jordán Luque
相关产品推荐
相关产品推荐

