文章目录
概述
TextView 是 Android 中最基础、最常用的 UI 组件之一,用于显示文本内容。
基本使用
在xml布局中定义TextView
<TextView
android:id="@+id/my_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是文本" />
在Activity中获取TextView
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
效果如图:
样式设置
在xml中进行设置
<TextView
<!-- 设置组件唯一标识 -->
android:id="@+id/my_textView"
<!-- 设置组件宽度 -->
android:layout_width="wrap_content"
<!-- 设置组件高度 -->
android:layout_height="wrap_content"
<!-- 设置文本颜色 -->
android:textColor="#FF0000"
<!-- 设置外边距,可以单独设置上下左右各边的外边距 -->
android:layout_margin="25dp"
<!-- 背景色 -->
android:background="#3C3F41"
<!-- 设置组件中的图标,放在左侧,也可以放在其他位置 -->
android:drawableLeft="@drawable/img"
<!-- 图标与文本的内边距 -->
android:drawablePadding="3dp"
<!-- 文本过长时省略方式 (end, start, middle, marquee) -->
android:ellipsize="marquee"
<!-- 字体 -->
android:fontFamily="sans-serif"
<!-- 文本对齐方式 (start, end, center, top, bottom等) -->
android:gravity="center"
<!-- 文本每个字之间的间距 -->
android:letterSpacing="3"
<!-- 行间距 -->
android:lineSpacingExtra="5dp"
<!-- 文本允许显示的最大行 -->
android:maxLines="3"
<!-- 内边距 -->
android:padding="15dp"
<!-- 设置显示的文本内容 -->
android:text="我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本"
<!-- 文本字体大小 -->
android:textSize="18dp"
<!-- 文本字体风格,可以是加粗、斜体等 -->
android:textStyle="bold"
<!-- 字体类型 (normal, sans, serif, monospace) -->
android:typeface="normal"
/>
效果如图:
在Java中实现
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 设置文本颜色 (红色)
myTextView.setTextColor(Color.parseColor("#FF0000"));
// 设置外边距 (25dp)
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) myTextView.getLayoutParams();
params.setMargins(dpToPx(25), dpToPx(25), dpToPx(25), dpToPx(25));
myTextView.setLayoutParams(params);
// 设置背景色
myTextView.setBackgroundColor(Color.parseColor("#3C3F41"));
// 设置左侧图标
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.img);
if (drawable != null) {
// 必须设置边界,否则设置的图标不生效
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
// 将图标设置在左侧位置
myTextView.setCompoundDrawables(drawable, null, null, null);
}
// 设置图标与文本的内边距
myTextView.setCompoundDrawablePadding(dpToPx(1));
// 设置文本过长时省略方式
myTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
// 设置字体
myTextView.setTypeface(Typeface.SANS_SERIF, Typeface.NORMAL);
// 设置文本对齐方式
myTextView.setGravity(Gravity.CENTER);
// 设置字符间距
myTextView.setLetterSpacing(3);
// 设置行间距
myTextView.setLineSpacing(dpToPx(10), 1.0f);
// 设置最大行数
myTextView.setMaxLines(3);
// 设置内边距
myTextView.setPadding(dpToPx(5), dpToPx(15), dpToPx(15), dpToPx(15));
// 设置文本内容
myTextView.setText("我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本");
// 设置文本大小
myTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
// 设置文本样式 (加粗)
myTextView.setTypeface(myTextView.getTypeface(), Typeface.BOLD);
}
// 将 dp 转换为像素
public int dpToPx(int dp) {
float density = getResources().getDisplayMetrics().density;
return (int) (dp * density + 0.5f); // 四舍五入
}
}
效果如图:
为文本部分内容设置样式
需要采用Java代码进行控制:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 文本原内容
String text = "允许文本部分内容设置样式";
// 通过该对象来设置文本部分内容的样式
SpannableString spannableString = new SpannableString(text);
// 设置部分文本颜色,这里设置的是前四个字符为红色,包括start所在字符,但不包括end所在字符
spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置部分文本加粗
spannableString.setSpan(new StyleSpan(Typeface.BOLD), 6, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 为组件设置文本内容
myTextView.setText(spannableString);
myTextView.setTextSize(28);
效果如图:
用html标签来设置文本样式
也是在java代码中进行设置,例如:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 带有html标签的文本内容
String htmlContent = "<b>加粗文本</b><font color='red'>红色文本</font>";
myTextView.setText(Html.fromHtml(htmlContent, Html.FROM_HTML_MODE_LEGACY));
myTextView.setTextSize(28);
效果如图:
自动识别超链接或邮箱或电话
在xml中进行设置:
android:autoLink="web|email|phone"
android:text="https://www.google.com"
效果如图:
设置通用样式
即在xml文件中通过调用styles
中的样式设置来为所有文本组件设置相同的样式,而不必重复写这些属性。
首先创建 styles.xml
,其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTextAppearance">
<item name="android:textColor">#FF0000</item>
<item name="android:textSize">25dp</item>
</style>
</resources>
接着在布局xml文件中进行调用:
<TextView
android:id="@+id/my_textView"
style="@style/MyTextAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是文本" />
效果如图:
设置边框样式
有时候我们想要让文本具有一个边框。那么先在res/drawable
目录下创建一个textview_border.xml
文件,内容如下,主要是用来设置边框的具体样式,例如颜色,宽度等。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 边框颜色 -->
<stroke
android:width="2dp"
android:color="#FF0000" />
<!-- 背景色 -->
<solid android:color="#FFFFFF" />
<!-- 圆角半径 -->
<corners android:radius="8dp" />
<!-- 内边距 -->
<padding
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp" />
</shape>
接着在布局xml中进行调用:
<TextView
android:id="@+id/my_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/textview_border"
android:text="带边框的TextView"
android:textSize="25dp"
android:padding="15dp"
/>
效果如图:
也可以利用Java代码来实现边框样式:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 创建GradientDrawable作为背景,即创建边框样式
GradientDrawable border = new GradientDrawable();
border.setStroke(4, Color.RED); // 边框宽度和颜色
border.setCornerRadius(16f); // 圆角半径
border.setColor(Color.WHITE); // 背景色
myTextView.setBackground(border);
其他设置
在xml中进行设置
<TextView
android:id="@+id/my_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是文本"
<!-- 以图片作为背景 -->
android:background="@drawable/img"
<!-- 是否允许该组件使用 -->
android:enabled="true"
<!-- 设置组件是否可见 -->
android:visibility="visible"
<!-- 设置组件是否可点击 -->
android:clickable="true"
<!-- 设置组件是否可长按 -->
android:longClickable="true"
/>
在Java中实现
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 以图片作为背景
myTextView.setBackgroundResource(R.drawable.img);
// 是否允许该组件使用,false表示否
myTextView.setEnabled(true);
// 设置组件是否可见,还可以取View.GONE和View.INVISIBLE都表示不可见
myTextView.setVisibility(View.VISIBLE);
// 设置组件是否可点击
myTextView.setClickable(true);
// 设置组件是否可长按
myTextView.setLongClickable(true);
事件
单击事件
如果TextView
是不可点击那么在xml中设置 android:clickable="true"
或在代码中调用 myTextView .setClickable(true)
。
实现方法一,直接注册:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 直接注册点击事件
myTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 这里写点击事件的处理逻辑,例如给出提示
Toast.makeText(MainActivity.this, "TextView被点击", Toast.LENGTH_SHORT).show();
}
});
效果如图:
可以采用Lambda表达式简化:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 直接注册点击事件
myTextView.setOnClickListener(v -> {
// 这里写点击事件的处理逻辑,例如给出提示
Toast.makeText(MainActivity.this, "TextView被点击", Toast.LENGTH_SHORT).show();
});
实现方法二,实现View.OnClickListener
:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 注册事件
myTextView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.my_textView) {
// 这里写点击事件的处理逻辑,例如给出提示
Toast.makeText(MainActivity.this, "TextView被点击", Toast.LENGTH_SHORT).show();
}
}
}
长按事件
长按住该组件不动即触发事件:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 注册事件
myTextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(MainActivity.this, "长按TextView", Toast.LENGTH_SHORT).show();
return true; // 返回true表示已处理事件,不再触发点击事件
}
});
文本改变监听事件
当文本发生改变时,将触发的事件:
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 设置一个点击事件来随机改变文本内容,用来做模拟测试
myTextView.setOnClickListener(view -> myTextView.setText(String.valueOf(new Random().nextInt(10))));
// 注册文本改变监听事件
myTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 文本改变前调用
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 文本改变时调用
}
@Override
public void afterTextChanged(Editable s) {
// 文本改变后调用
Toast.makeText(MainActivity.this, "当前文本: " + s.toString(), Toast.LENGTH_SHORT).show();
}
});
效果如图:
完整实例
xml文件内容如下:
<?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="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/my_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="25dp"
android:drawableLeft="@drawable/img"
android:gravity="center"
android:maxLines="3"
android:padding="15dp"
android:text="我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本我是文本"
android:textColor="#FF0000"
android:textSize="18dp"
android:textStyle="bold" />
</LinearLayout>
java 逻辑处理代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取TextView组件
TextView myTextView = findViewById(R.id.my_textView);
// 直接注册点击事件
myTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 这里写点击事件的处理逻辑,例如给出提示
Toast.makeText(MainActivity.this, "TextView被点击", Toast.LENGTH_SHORT).show();
}
});
// 注册长按事件
myTextView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(MainActivity.this, "长按TextView", Toast.LENGTH_SHORT).show();
return true; // 返回true表示已处理事件,不再触发点击事件
}
});
// 注册文本变化监听事件
myTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 文本改变前调用
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 文本改变时调用
}
@Override
public void afterTextChanged(Editable s) {
// 文本改变后调用
Toast.makeText(MainActivity.this, "当前文本: " + s.toString(), Toast.LENGTH_SHORT).show();
}
});
}
}
效果如图: