珠海网站制作推广公司,网站建设钅金手指排名,建设工程施工合同条例,微信网站制作免费Android ConstraintLayout 基础 屏障线 Barrier设置水平和垂直方向的约束关系长宽比链式结构组站位辅助线 参考地址 屏障线 Barrier
以下是使用 ConstraintLayout 在 Android 中实现简单屏障线#xff08;Barrier#xff09;使用的示例代码#xff0c;主要步骤如下#xf… Android ConstraintLayout 基础 屏障线 Barrier设置水平和垂直方向的约束关系长宽比链式结构组站位辅助线 参考地址 屏障线 Barrier
以下是使用 ConstraintLayout 在 Android 中实现简单屏障线Barrier使用的示例代码主要步骤如下
首先在 Android 项目的布局 XML 文件中将根布局设置为 ConstraintLayout。例如创建一个名为 activity_main.xml 的布局文件以下代码基于 Kotlin 语言环境Java 语言使用方式类似只是语法上稍有不同
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivity!-- 创建两个视图这里以两个 TextView 为例 --TextViewandroid:idid/textView1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 1app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/textView2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 2app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/textView1 /!-- 创建屏障 --androidx.constraintlayout.widget.Barrierandroid:idid/barrierandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:barrierDirectionendapp:constraint_referenced_idstextView1,textView2 /!-- 再创建一个视图让它根据屏障来布局 --Buttonandroid:idid/buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textButtonapp:layout_constraintStart_toEndOfid/barrierapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget ConstraintLayout在上述代码中
首先定义了两个 TextViewtextView1 和 textView2它们都是靠父布局左侧start 侧对齐并且垂直排列。接着创建了一个 Barrierbarrier通过 app:constraint_referenced_ids 属性指定它关联的视图为 textView1 和 textView2app:barrierDirectionend 表示这个屏障的方向是在关联视图的右侧结束侧会根据关联视图中最右侧的边界来确定自身位置。最后创建了一个 Button它的左侧start 侧通过 app:layout_constraintStart_toEndOfid/barrier 约束到了这个屏障的右侧这样按钮就会位于两个 TextView 的右侧并且会随着 TextView 中靠右侧最远的那个视图位置变化而自适应位置。
https://www.jianshu.com/p/6ee3caaa4135
设置水平和垂直方向的约束关系 在XML布局文件中设置约束关系静态方式 水平方向约束关系 左对齐start对齐 假设在ConstraintLayout中有一个TextView要使其左边缘与父布局的左边缘对齐可以这样设置 TextViewandroid:idid/textViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHelloapp:layout_constraintStart_toStartOfparent/这里app:layout_constraintStart_toStartOfparent表示将textView的start在从左到右的布局语言环境中相当于左侧边缘与父布局parent的start边缘对齐。 右对齐end对齐 例如要使一个Button的右边缘与父布局的右边缘对齐 Buttonandroid:idid/buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textClick Meapp:layout_constraintEnd_toEndOfparent/其中app:layout_constraintEnd_toEndOfparent用于将button的end在从左到右的布局语言环境中相当于右侧边缘与父布局的end边缘对齐。 水平居中对齐 对于一个ImageView要使其在父布局中水平居中可以使用以下约束 ImageViewandroid:idid/imageViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintStart_toStartOfparentapp:layout_constraintEnd_toEndOfparent/通过将imageView的start边缘与父布局的start边缘对齐并且end边缘与父布局的end边缘对齐就可以实现水平居中。 垂直方向约束关系 顶部对齐top对齐 假设有一个EditText要使其顶部边缘与父布局的顶部边缘对齐 EditTextandroid:idid/editTextandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentapp:layout_constraintTop_toTopOfparent/这里app:layout_constraintTop_toTopOfparent确保了editText的top边缘与父布局的top边缘对齐。 底部对齐bottom对齐 例如使一个LinearLayout的底部边缘与父布局的底部边缘对齐 LinearLayoutandroid:idid/linearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparent/其中app:layout_constraintBottom_toBottomOfparent实现了linearLayout的bottom边缘与父布局的bottom边缘对齐。 垂直居中对齐 对于一个View要使其在父布局中垂直居中可以这样设置 Viewandroid:idid/viewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintTop_toTopOfparentapp:licensePlateConstraintBottom_toBottomOfparent/通过同时将view的top边缘与父布局的top边缘对齐以及bottom边缘与父布局的bottom边缘对齐实现垂直居中。 在Java代码中设置约束关系动态方式 使用ConstraintSet设置水平方向约束关系 首先在Activity的onCreate方法或者其他合适的方法中获取ConstraintLayout和要设置约束的视图以及创建ConstraintSet对象 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private Button button;private ConstraintSet constraintSet;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);button findViewById(R.id.button);constraintSet new ConstraintSet();}
}左对齐start对齐 假设要将button的start边缘与父布局的start边缘对齐可以这样设置 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.START, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.START);
constraintSet.applyTo(constraintLayout);首先通过constraintSet.clone(constraintLayout)克隆当前布局的约束集。然后使用constraintSet.connect方法将button的START左侧约束连接到父布局ConstraintLayout.LayoutParams.PARENT_ID的START边缘。最后通过constraintSet.applyTo(constraintLayout)将修改后的约束应用到布局中。 右对齐end对齐 要将button的end边缘与父布局的end边缘对齐可以使用以下代码 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.END, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.END);
constraintSet.applyTo(constraintLayout);这里的逻辑与左对齐类似只是将连接的方向改为END右侧。 水平居中对齐 若要使button在父布局中水平居中可以这样设置 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.START, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.START);
constraintSet.connect(button.getId(), ConstraintSet.END, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.END);
constraintSet.applyTo(constraintLayout);通过同时将button的START和END边缘分别与父布局的START和END边缘连接实现水平居中。 使用ConstraintSet设置垂直方向约束关系 顶部对齐top对齐 假设要将button的top边缘与父布局的top边缘对齐可以这样设置 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.TOP, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.TOP);
constraintSet.applyTo(constraintLayout);首先克隆约束集然后使用connect方法将button的TOP顶部约束连接到父布局的TOP边缘最后应用修改后的约束。 底部对齐bottom对齐 要将button的bottom边缘与父布局的bottom边缘对齐可以使用以下代码 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.BOTTOM, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.BOTTOM);
constraintSet.applyTo(constraintLayout);这里的逻辑与顶部对齐类似只是将连接的方向改为BOTTOM底部。 垂直居中对齐 若要使button在父布局中垂直居中可以这样设置 constraintSet.clone(constraintLayout);
constraintSet.connect(button.getId(), ConstraintSet.TOP, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.TOP);
constraintSet.connect(button.getId(), ConstraintSet.BOTTOM, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintSet.BOTTOM);
constraintSet.applyTo(constraintLayout);通过同时将button的TOP和BOTTOM边缘分别与父布局的TOP和BOTTOM边缘连接实现垂直居中。
长宽比 在XML布局文件中设置长宽比约束静态方式 使用app:layout_constraintDimensionRatio属性 例如对于一个ImageView想要保持其宽度和高度的特定比例假设为16:9可以这样设置 ImageViewandroid:idid/imageViewandroid:layout_width0dpandroid:layout_height0dpapp:layout_constraintDimensionRatio16:9app:layout_constraintStart_toStartOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintBottom_toBottomOfparent/这里将layout_width和layout_height都设置为0dp这是因为在使用长宽比约束时需要通过其他约束如这里的start、end、top、bottom与父布局的对齐约束来确定视图的整体尺寸范围然后按照指定的长宽比来分配宽度和高度。app:layout_constraintDimensionRatio16:9指定了宽度和高度的比例关系。 在Java代码中设置长宽比约束动态方式 使用ConstraintSet设置长宽比约束 首先在Activity的onCreate方法或者其他合适的方法中获取ConstraintLayout和视图以及创建ConstraintSet对象。以下以一个Button为例 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private Button button;private ConstraintSet constraintSet;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);button findViewById(R.id.button);constraintSet new ConstraintSet();}
}假设要为button设置长宽比为4:3可以这样做 constraintSet.clone(constraintLayout);
// 设置长宽比为4:3
constraintSet.setDimensionRatio(button.getId(), 4:3);
// 需要同时设置宽度和高度的约束方式例如都设置为WRAP_CONTENT
constraintSet.constrainWidth(button.getId(), ConstraintSet.WRAP_CONTENT);
constraintSet.constrainHeight(button.getId(), ConstraintSet.WRAP_CONTENT);
constraintSet.applyTo(constraintLayout);首先通过constraintSet.clone(constraintLayout)克隆当前布局的约束集。然后使用constraintSet.setDimensionRatio(button.getId(), 4:3)设置button的长宽比为4:3。需要注意的是同时还要通过constraintSet.constrainWidth和constraintSet.constrainHeight设置宽度和高度的约束方式这里都设置为WRAP_CONTENT也可以根据实际情况设置为MATCH_PARENT或固定尺寸等最后通过constraintSet.applyTo(constraintLayout)将修改后的约束应用到布局中。
链式结构 链式结构在ConstraintLayout中的概念 在ConstraintLayout中链式结构是一种用于管理多个视图之间布局关系的方式。它允许将一组视图按照线性方式水平或垂直排列并定义它们之间的间距和对齐方式等约束。可以把它想象成一条链链上的每个环节视图都与相邻的环节相互关联并且整体链的布局受到特定规则的约束。 水平链式结构Horizontal Chains 创建水平链式结构XML方式 假设要创建一个水平链式结构包含三个TextView。首先在ConstraintLayout布局文件中进行如下设置 androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:idid/textView1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 1app:layout_constraintHorizontal_chainStylespreadapp:layout_constraintStart_toStartOfparent/TextViewandroid:idid/textView2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 2app:layout_constraintStart_toEndOfid/textView1/TextViewandroid:idid/textView3android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 3app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toEndOfid/textView2/
/androidx.constraintlayout.widget.ConstraintLayout在这个例子中 app:layout_constraintHorizontal_chainStylespread应用在textView1上这定义了水平链的样式为spread伸展。这种样式下链中的视图会在水平方向上均匀分布两端的视图分别与父布局的左右边缘对齐。textView1通过app:layout_constraintStart_toStartOfparent与父布局的左侧对齐。textView2通过app:layout_constraintStart_toEndOfid/textView1与textView1的右侧连接。textView3通过app:layout_constraintEnd_toEndOfparent与父布局的右侧对齐并且通过app:layout_constraintStart_toEndOfid/textView2与textView2的右侧连接这样就形成了一个水平链式结构。 水平链式结构的样式chainStyle spread伸展样式 如上述示例视图会均匀分布在水平方向上并且两端的视图会分别与父布局的左右边缘对齐。如果有剩余空间会平均分配到每个视图之间的间距中。 spread_inside内部伸展样式 与spread类似但两端的视图不会与父布局的边缘对齐而是链中的视图在除去两端视图与父布局边缘的间距后在内部均匀分布。例如 TextViewandroid:idid/textView1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 1app:layout_constraintHorizontal_chainStylespread_insideapp:layout_constraintStart_toStartOfparent/这样设置后textView1和其他在链中的视图会在父布局内部更均匀地分布两端会留出一定的间距。 packed紧凑样式 链中的视图会紧密排列在一起并且可以通过app:layout_constraintHorizontal_bias属性来控制它们在水平方向上相对于链的起始位置的偏移量。例如 TextViewandroid:idid/textView1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 1app:layout_constraintHorizontal_chainStylepackedapp:layout_constraintStart_toStartOfparent/视图会紧凑地排列并且可以根据需要调整bias属性来改变它们在水平方向上的位置。 在Java代码中设置水平链式结构 首先在Activity的onCreate方法中获取ConstraintLayout和相关视图并创建ConstraintSet对象 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private TextView textView1;private TextView textView2;private TextView textView3;private ConstraintSet constraintSet;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);textView1 findViewById(R.id.textView1);textView2 findViewById(R.id.textView2);textView3 findViewById(R.id.textView3);constraintSet new ConstraintSet();}
}假设要将水平链式结构的样式从spread改为packed可以这样做 constraintSet.clone(constraintLayout);
constraintSet.setHorizontalChainStyle(textView1.getId(), ConstraintSet.CHAIN_PACKED);
// 应用修改后的约束
constraintSet.applyTo(constraintLayout);这里通过constraintSet.setHorizontalChainStyle方法将以textView1为头部的水平链式结构的样式修改为packed然后应用到布局中。 垂直链式结构Vertical Chains 创建垂直链式结构XML方式 例如要创建一个垂直链式结构包含三个Button在ConstraintLayout布局文件中设置如下 androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentButtonandroid:idid/button1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textButton 1app:layout_constraintVertical_chainStylespreadapp:layout_constraintTop_toTopOfparent/Buttonandroid:idid/button2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textButton 2app:layout_constraintTop_toBottomOfid/button1/Buttonandroid:idid/button3android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textButton 3app:layout_constraintBottom_toBottomOfparentapp:layout_constraintTop_toBottomOfid/button2/
/androidx.constraintlayout.widget.ConstraintLayout在这个例子中 app:layout_constraintVertical_chainStylespread应用在button1上定义了垂直链的样式为spread伸展。在这种样式下链中的视图会在垂直方向上均匀分布两端的视图分别与父布局的上下边缘对齐。button1通过app:layout_constraintTop_toTopOfparent与父布局的顶部对齐。button2通过app:layout_constraintTop_toBottomOfid/button1与button1的底部连接。button3通过app:layout_constraintBottom_toBottomOfparent与父布局的底部对齐并且通过app:layout_constraintTop_toBottomOfid/button2与button2的底部连接从而形成一个垂直链式结构。 垂直链式结构的样式chainStyle 垂直链式结构的样式spread、spread_inside、packed与水平链式结构类似只是方向是垂直的。它们在垂直方向上控制视图的分布和对齐方式。 在Java代码中设置垂直链式结构 首先在Activity的onCreate方法中获取ConstraintLayout和相关视图并创建ConstraintSet对象 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private Button button1;private Button button2;private Button button3;private ConstraintSet constraintSet;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);button1 findViewById(R.id.button1);button2 findViewById(R.id.button2);button3 findViewById(R.id.button3);constraintSet new ConstraintSet();}
}假设要将垂直链式结构的样式从spread改为packed可以这样做 constraintSet.clone(constraintLayout);
constraintSet.setVerticalChainStyle(button1.getId(), ConstraintSet.CHAIN_PACKED);
// 应用修改后的约束
constraintSet.applyTo(constraintLayout);这里通过constraintSet.setVerticalChainStyle方法将以button1为头部的垂直链式结构的样式修改为packed然后应用到布局中。
组 在XML布局文件中使用组Groups 创建组的基本语法 在ConstraintLayout中可以使用androidx.constraintlayout.widget.Group标签来创建一个组。例如要将两个TextView归为一组可以这样写 androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:idid/textView1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 1app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent/TextViewandroid:idid/textView2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textTextView 2app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/textView1/androidx.constraintlayout.widget.Groupandroid:idid/groupandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:constraint_referenced_idstextView1,textView2/
/androidx.constraintlayout.widget.ConstraintLayout在这个例子中androidx.constraintlayout.widget.Group标签有一个app:constraint_referenced_ids属性用于指定组内包含的视图的id。这里将textView1和textView2归为一组组的id为group。 控制组的可见性来管理视图可见性 可以通过在Java代码中控制组的可见性从而同时控制组内所有视图的可见性。例如在Activity的onCreate方法中 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Group;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private TextView textView1;private TextView textView2;private Group group;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);textView1 findViewById(R.id.textView1);textView2 findViewById(R.id.textView2);group findViewById(R.id.group);// 隐藏组内的所有视图group.setVisibility(View.GONE);}
}当执行group.setVisibility(View.GONE);时组内的textView1和textView2都会被隐藏。同样如果设置为View.VISIBLE组内的视图都会显示。 在Java代码中创建和管理组动态方式 创建组并添加视图到组中 首先在Activity的onCreate方法中获取ConstraintLayout对象然后创建一个Group对象并添加视图到组中。以下是一个示例 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Group;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private TextView textView1;private TextView textView2;private Group group;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);textView1 findViewById(R.id.textView1);textView2 findViewById(R.id.textView2);group new Group(constraintLayout.getContext());group.setId(View.generateViewId());group.addView(textView1);group.addView(textView2);constraintLayout.addView(group);}
}这里首先创建了一个Group对象然后通过setId方法为组设置一个唯一的id。接着使用addView方法将textView1和textView2添加到组中最后将组添加到ConstraintLayout中。 控制组的可见性动态管理视图可见性 可以在任何事件处理方法或者需要的地方控制组的可见性。例如在一个按钮点击事件处理方法中 public void onButtonClick(View view) {if (group.getVisibility() View.VISIBLE) {group.setVisibility(View.GONE);} else {group.setVisibility(View.VISIBLE);}
}这段代码通过检查组的当前可见性状态如果是可见的则将组以及组内的所有视图隐藏如果是隐藏的则将组以及组内的所有视图显示。这样就可以通过组来方便地管理多个视图的可见性。
站位 Placeholder在ConstraintLayout中的概念 Placeholder是ConstraintLayout中的一个特殊组件它主要用于在布局中预留一个位置这个位置可以在运行时被其他视图替换。就像是在舞台上为某个演员视图预留了一个特定的站位当需要的时候真正的演员视图就可以站到这个位置上。 在XML布局文件中使用Placeholder静态方式 基本使用示例 假设在一个ConstraintLayout布局中有一个Placeholder并且在合适的时候要用一个TextView来替换它。首先在布局文件中定义Placeholder和TextView androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.constraintlayout.widget.Placeholderandroid:idid/placeholderandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent/TextViewandroid:idid/textViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textReplaced Textandroid:visibilitygone/
/androidx.constraintlayout.widget.ConstraintLayout在这个例子中Placeholder通过app:layout_constraintStart_toStartOfparent和app:layout_constraintTop_toTopOfparent约束在父布局的左上角。TextView的初始可见性设置为gone因为它一开始不需要显示等待替换Placeholder的时候再显示。 替换Placeholder的操作在Java代码中实现 在Activity的onCreate方法或者其他合适的方法中进行如下操作来替换Placeholder import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Placeholder;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private Placeholder placeholder;private TextView textView;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);placeholder findViewById(R.id.placeholder);textView findViewById(R.id.textView);placeholder.setContentId(textView.getId());textView.setVisibility(View.VISIBLE);}
}首先通过placeholder.setContentId(textView.getId());语句将textView的id设置给Placeholder这就告诉Placeholder要被textView替换。然后将textView的可见性设置为View.VISIBLE这样textView就会显示在原来Placeholder所在的位置完成替换操作。 Placeholder的优势和应用场景 优势 布局灵活性可以在布局设计阶段预先为不同类型的视图预留位置根据运行时的条件如用户权限、数据加载情况等动态地填充合适的视图而不需要频繁地修改布局结构。代码可读性和可维护性使得布局和视图替换的逻辑更加清晰。通过Placeholder的机制开发人员可以很容易地理解某个位置上的视图是可以被替换的并且替换的操作集中在代码中的特定部分便于维护。 应用场景 动态内容展示例如在一个新闻应用中根据新闻类型文字新闻、图片新闻、视频新闻等可以在一个预留的Placeholder位置展示不同的视图来呈现新闻内容。权限相关布局变化如果一个应用中有部分功能需要特定权限才能使用当用户权限状态改变时可以使用Placeholder在相同位置替换不同的视图来显示权限允许或禁止时的不同界面内容。
辅助线 Guideline在ConstraintLayout中的概念 Guideline是ConstraintLayout中的一种辅助布局工具它本质上是一条虚拟的线用于帮助开发者更精准地定位和约束视图。这条线可以是水平方向的也可以是垂直方向的并且可以设置其位置相对于布局的边界如parent的边缘或者相对于布局的百分比位置为视图的布局提供参考依据。 在XML布局文件中使用Guideline静态方式 创建水平Guideline 例如要创建一条水平方向的Guideline将其位置设置为距离布局顶部30%的位置可以这样写 androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.constraintlayout.widget.Guidelineandroid:idid/horizontalGuidelineandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_percent0.3/TextViewandroid:idid/textViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHelloapp:layout_constraintTop_toTopOfid/horizontalGuideline/
/androidx.constraintlayout.widget.ConstraintLayout在这个例子中androidx.constraintlayout.widget.Guideline标签用于创建Guideline。android:orientationhorizontal表示这是一条水平方向的线。app:layout_constraintGuide_percent0.3将Guideline的位置设置为距离布局顶部30%的高度处。然后TextView通过app:layout_constraintTop_toTopOfid/horizontalGuideline将其顶部约束到这条Guideline的顶部从而使TextView的位置与Guideline相关联。 创建垂直Guideline 假设要创建一条垂直方向的Guideline位于距离布局左侧20%的位置代码如下 androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.constraintlayout.widget.Guidelineandroid:idid/verticalGuidelineandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationverticalapp:layout_constraintGuide_begin20%p/Buttonandroid:idid/buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textClick Meapp:layout_constraintStart_toStartOfid/verticalGuideline/
/androidx.constraintlayout.widget.ConstraintLayout这里android:orientationvertical表示是垂直方向的Guideline。app:layout_constraintGuide_begin20%p将Guideline的位置设置为距离布局左侧20%%p表示相对于父布局的百分比。Button通过app:layout_constraintStart_toStartOfid/verticalGuideline将其左侧约束到这条Guideline的左侧确定了Button的水平位置。 Guideline位置的其他设置方式 除了使用百分比app:layout_constraintGuide_percent和app:layout_constraintGuide_begin来设置位置外还可以将Guideline直接与布局的边缘对齐。例如将水平Guideline与布局底部对齐 androidx.constraintlayout.widget.Guidelineandroid:idid/bottomGuidelineandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_endparentBottom/这里app:layout_constraintGuide_endparentBottom表示将Guideline的底部与父布局的底部对齐。 在Java代码中使用Guideline动态方式 获取和修改Guideline的位置以垂直Guideline为例 首先在Activity的onCreate方法中获取ConstraintLayout和Guideline对象 import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {private ConstraintLayout constraintLayout;private Guideline verticalGuideline;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);constraintLayout findViewById(R.id.constraint_layout);verticalGuideline findViewById(R.id.verticalGuideline);}
}假设要将垂直Guideline的位置从距离左侧20%修改为30%可以这样做 import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Guideline;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {// 前面代码省略...Overrideprotected void onCreate(Bundle savedInstanceState) {// 前面代码省略...ConstraintLayout.LayoutParams guidelineParams (ConstraintLayout.LayoutParams) verticalGuideline.getLayoutParams();guidelineParams.guidePercent 0.3f;verticalGuideline.setLayoutParams(guidelineParams);}
}首先通过verticalGuideline.getLayoutParams()获取Guideline的布局参数然后将guidePercent属性修改为0.3f表示30%最后通过verticalGuideline.setLayoutParams(guidelineParams)应用修改后的布局参数从而改变Guideline的位置。
通过使用Guideline可以更灵活地控制视图的布局特别是在需要按照一定比例或者相对于布局边界进行精确布局的情况下能够大大提高布局的准确性和可维护性。
参考地址
豆包AI