Android 将布局变成 控件
程序员文章站
2022-03-11 18:55:16
在项目开发的时候,有时会出现多个相同的布局,如果复制黏贴,会增加代码的重复量,所以可以将布局控件化,通过属性的变化来控制布局的相应变化。如:先画出一个通用布局的layout,
在项目开发的时候,有时会出现多个相同的布局,如果复制黏贴,会增加代码的重复量,所以可以将布局控件化,通过属性的变化来控制布局的相应变化。
如:先画出一个通用布局的layout,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/colorPrimary">
<TextView
android:id="@+id/first_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="张三"
tools:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"/>
<TextView
android:id="@+id/second_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="李四"
tools:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"/>
<TextView
android:id="@+id/thread_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="王五"
tools:textColor="@color/white"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"/>
</LinearLayout>
这个只是一个简单的三个 TextView
通过属性改 文字内容与 颜色
需要在根布局 加
xmlns:tools="http://schemas.android.com/tools"
将需要的改的属性,可以使用
tools:text="张三" tools:textColor="@color/white"
接下来,需要设置属性: 在 res/values 下创建 attrs.xml 文件,将需要的属性进行定义,此次 有三个TextView 分别有文本跟颜色,所以需要 6个属性
<declare-styleable name="MtTextTest"> <attr name="first_note_text" format="string"/> <attr name="first_text_color" format="string"/> <attr name="second_note_text" format="string"/> <attr name="second_text_color" format="string"/> <attr name="thread_note_text" format="string"/> <attr name="thread_text_color" format="string"/> </declare-styleable>
下一步,自定义View,使其可以在其他布局引用
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.duke.mvvmtesr.R;
public class MtTextTest extends FrameLayout {
private View mView;
private Context mContext;
private TextView first_tv;
private TextView second_tv;
private TextView thread_tv;
public MtTextTest(Context context) {
this(context, null);
}
public MtTextTest(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MtTextTest(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void setText(String flag, String note) {
if (note != null && !note.equals("")) {
if (flag.equals("1")) {
first_tv.setText(note);
} else if (flag.equals("2")) {
second_tv.setText(note);
} else {
thread_tv.setText(note);
}
} else {
if (flag.equals("1")) {
first_tv.setText("给个空的干嘛!");
} else if (flag.equals("2")) {
second_tv.setText("给个空的干嘛!");
} else {
thread_tv.setText("给个空的干嘛!");
}
}
}
private void setTextColor(String flag, String color) {
if (flag.equals("1")) {
first_tv.setTextColor(Color.parseColor(color));
} else if (flag.equals("2")) {
second_tv.setTextColor(Color.parseColor(color));
} else {
thread_tv.setTextColor(Color.parseColor(color));
}
}
private void init(Context context, AttributeSet attrs) {
mContext = context;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(R.layout.text_item_layout, this, true);
first_tv = mView.findViewById(R.id.first_tv);
second_tv = mView.findViewById(R.id.second_tv);
thread_tv = mView.findViewById(R.id.thread_tv);
TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.MtTextTest);
setText("1",a.getString(R.styleable.MtTextTest_first_note_text));
setText("2",a.getString(R.styleable.MtTextTest_second_note_text));
setText("3",a.getString(R.styleable.MtTextTest_thread_note_text));
setTextColor("1",a.getString(R.styleable.MtTextTest_first_text_color));
setTextColor("2",a.getString(R.styleable.MtTextTest_second_text_color));
setTextColor("3",a.getString(R.styleable.MtTextTest_thread_text_color));
}
}
接下来就可以在其他布局中引用了:
<自定义控件位置.MtTextTest
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:first_note_text="第一个名字"
app:second_note_text="第二个名字"
app:thread_note_text="第三个名字"
app:first_text_color="#7FFF00"
app:second_text_color="#B22222"
app:thread_text_color="@color/yellow">
</自定义控件位置.MtTextTest>
本文地址:https://blog.csdn.net/duke_knight/article/details/107976156
上一篇: android studio 55线程更新UI handler
下一篇: Window层级
推荐阅读
-
Android给布局、控件加阴影效果实现方法
-
Android 组合控件实现布局的复用的方法
-
Android Material Design控件使用(一)——ConstraintLayout 约束布局
-
Kali将Android设备变成黑客瑞士军刀
-
Android给布局、控件加阴影效果的示例代码
-
【Android学习之路】Android布局和控件认识
-
Android基础-四种基本布局和自定义控件的步骤
-
Android_Develop:如何在代码中实时添加、移除布局、控件
-
Flutter混合开发 如何将Flutter项目变成Module导入Android项目(4.6)
-
Android 将布局变成 控件