Android TextView
Android TextView是非常基本的组件之一,并且使用很多。
今天让我们深入了解TextView。
根据Google文档:
TextView类代表用户界面组件的基本构建块。
视图在屏幕上占据一个矩形区域,并负责绘图和事件处理。
该视图是所有小部件的基类。
1. Android TextView
Android TextView类是View类的子类,旨在保存和显示文本。
通过导入软件包android.widget.TextView可以在代码中使用它。
通常,TextView不适用于编辑。
为了进行编辑,我们使用EditText
。
1.1)在布局中创建TextView
以下是在布局文件中定义TextView的方法。
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="com.theitroad.textviewexample.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" </LinearLayout>
android:text属性保存要显示的字符串。
android:id属性存储TextView的唯一标识符。
我们使用此ID在Java活动中检索TextView。在各自的活动/片段中,我们使用findViewById调用上述TextView
在当前的Android SDK版本中,右侧会推断出TextView类型。
在Android SDK <25中,我们必须将findViewById
强制转换为(TextView)
。理想情况下,我们无需在上述xml代码中对字符串进行硬编码,而应在
strings.xml
文件中进行设置,并将其用作:`android:text =" @ string/app_name""
1.2)TextView的重要属性
下面列出了TextView的一些常用属性。
android:textColor:设置文本的颜色。
可以设置为#rgb #rrggbb #aarrggbb。
(aa表示透明度,不透明度。
我们也可以从colors.xml中设置颜色。
例如:@ color/colorPrimaryDark或者@android:color/white`android:textSize:设置textView的大小。
通常,它以sp(缩放像素)设置。
示例:18sp。android:textAllCaps:设置布尔值。
设置为true将大写字符串。android:textStyle:默认情况下,样式为普通样式。
您可以将其设置为"粗体","斜体"。
要一起设置一个或者多个,请使用|
。android:maxLines:设置您希望文本进入的最大行数。
将其设置为1将使其成为一行TextView。android:ellipsize:用于截断长于视图而不是被破坏的文本。
start
添加一个..代替字符串的起始字符。end
将它们添加为其余字符。middle
将其添加为中间的。
设置'marquee'可使textview连续左右滑动。
为了使选取框正常工作,请设置ʻandroid:textIsSelected =" true""和ʻandroid:scrollHorizontally =" true""android:gravity:当字符串小于TextView的宽度/高度时,指定文本在视图的x轴和/或者y轴上的对齐方式。
android:lineSpacingMultiplier:文本行之间的另外间隔,作为一个乘数。
设置1.5将使间距比当前间距大1.5倍。android:textAppearance:为文本设置样式,包括其自身的颜色,大小,字体等。
我们可以使用内置样式,也可以在styles.xml文件中创建自己的样式。android:typeface:用于设置以下字符的字体:monospace,serif,sans,normal。
android:visibility:用于设置TextView的可见性,包括:"可见","不可见","消失"。
"消失"与"不可见"不同。
消失使TextView不可见,并从布局中消失。
在不可见的情况下,TextView仍位于完全相同的位置。
让我们尝试在Android Studio项目的" activity_main.xml"文件中进行设置。
TextView textView = findViewById(R.id.textView);
为了避免在布局文件中保留较长的硬编码字符串,我们在strings.xml文件中设置了一些文本。
无需对textSize进行硬编码,我们可以在资源目录下values文件夹中的dimens.xml
文件中进行设置。
具有更新的布局的活动的输出如下所示:
注意:strings.xml和dimens.xml文件以键值对形式(字典)保存值。
2.以编程方式创建TextView
我们可以直接在活动中创建TextView。
我们只需要初始化它,使用方法设置属性,然后将TextView对象添加到父布局中,如下所示。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:id="@+id/linearLayout" tools:context="com.theitroad.textviewexample.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:padding="16dp" android:textColor="@android:color/holo_red_dark" <TextView android:layout_width="50dp" android:layout_height="50dp" android:text="Hello World!" android:textColor="@android:color/holo_red_dark" <TextView android:layout_width="match_parent" android:text="Hello World!" android:gravity="center" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" <TextView android:layout_width="wrap_content" android:text="Hello World!" android:gravity="center" android:textAllCaps="true" android:textColor="@android:color/holo_green_dark" android:layout_height="wrap_content" <TextView android:layout_width="wrap_content" android:text="Hello World!" android:gravity="center" android:textStyle="bold|italic" android:layout_height="wrap_content" <TextView android:layout_width="wrap_content" android:text="Hello World!" android:gravity="center" android:typeface="sans" android:layout_height="wrap_content" <TextView android:layout_width="wrap_content" android:text="@string/long_string" android:gravity="center" android:ellipsize="end" android:maxLines="1" android:typeface="sans" android:textColor="#1F2124" android:layout_height="wrap_content" <TextView android:layout_width="wrap_content" android:text="@string/long_string_line_spacing" android:gravity="center" android:lineSpacingMultiplier="1.5" android:typeface="sans" android:textColor="@color/colorPrimary" android:layout_height="wrap_content" </LinearLayout>
要以编程方式设置TextView的可见性,我们使用setVisibility()并传递View.VISIBLE或者VIEW.INVISIBLE或者VIEW.GONE
2.1)设置TextView的宽度和高度
我们可以通过编程设置TextView的宽度和高度,如下所示。
package com.theitroad.textviewexample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout linearLayout = findViewById(R.id.linearLayout); TextView textView = new TextView(this); textView.setText("Now we've created a TextView programmatically"); linearLayout.addView(textView); } }
2.2)DP中的缩放宽度高度
在上面的代码中,我们将值设置为一个int值,以像素为单位计算宽度和高度。
像素因屏幕而异,因此我们需要使用密度独立像素(dp)。
要像在xml中一样在dp
中设置准确的尺寸,我们需要按如下所示进行缩放。
textView = new TextView(this); textView.setText("This TextView has the width and height fixed"); textView.setLayoutParams(new LinearLayout.LayoutParams(50, 50)); linearLayout.addView(textView); //set gravity too textView = new TextView(this); textView.setText("This TextView has the width and height set to wrap content and gravity as center"); textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); textView.setGravity(Gravity.CENTER); linearLayout.addView(textView);
最终,应在上面的代码中使用像素值,方法是将50传递到`dps'中
final float scale = getContext().getResources().getDisplayMetrics().density; int pixels = (int) (dps * scale + 0.5f);
2.3)设置TextView大小
我们可以通过以下方式以编程方式在TextView上设置大小:
TextView textView = new TextView(this); textView.setText("This TextView has the width and height fixed"); textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, pixels)); linearLayout.addView(textView);
由于上述代码中的TextView高度设置为10dp,因此将剪切显示的TextView。
2.4)以编程方式设置TextView颜色
final float scale = getBaseContext().getResources().getDisplayMetrics().density; int pixels = (int) (10 * scale + 0.5f); TextView textView = new TextView(this); textView.setText("This TextView has the size set on the object"); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP,15);
要从colors.xml中获取颜色,我们使用ContextCompat(Since API> 23)。
要设置rgb值,我们使用Color.parseColor()
。
在上面的代码中,我们在第二个TextView上将透明度设置为20%。
注意:我们也可以设置textView.setTextColor(Color.RED);
在MainActivity.java中初始化了具有上述TextViews的代码是:
TextView textView = new TextView(this); textView.setText("This TextView has the text color set on the object"); textView.setTextColor(ContextCompat.getColor(this, R.color.colorPrimaryDark)); linearLayout.addView(textView); textView = new TextView(this); textView.setText("This TextView has the text color set on the object"); textView.setTextColor(Color.parseColor("#20808080")); //or linearLayout.addView(textView);
运行上述代码时的输出为:
由于方向是垂直的,因此以编程方式创建的TextView被添加到LinearLayout的xml中。
3.使用TextView可绘制
我们可以定义一个TextView,并在其左/右/顶部/底部绘制一个图形。
package com.theitroad.textviewexample; import android.graphics.Color; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.TypedValue; import android.view.Gravity; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout linearLayout = findViewById(R.id.linearLayout); TextView textView = new TextView(this); textView.setText("Now we've created a TextView programmatically"); linearLayout.addView(textView); textView = new TextView(this); textView.setText("This TextView has the width and height fixed"); textView.setLayoutParams(new LinearLayout.LayoutParams(50, 50)); linearLayout.addView(textView); final float scale = getBaseContext().getResources().getDisplayMetrics().density; int pixels = (int) (10 * scale + 0.5f); textView = new TextView(this); textView.setText("This TextView has the width and height fixed"); textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, pixels)); linearLayout.addView(textView); textView = new TextView(this); textView.setText("This TextView has the width and height set to wrap content and gravity as center"); textView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); textView.setGravity(Gravity.CENTER); linearLayout.addView(textView); textView = new TextView(this); textView.setText("This TextView has the size set on the object"); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15); linearLayout.addView(textView); //or //textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimension(R.dimen.textSize)); textView = new TextView(this); textView.setText("This TextView has the text color set on the object"); textView.setTextColor(ContextCompat.getColor(this, R.color.colorPrimaryDark)); linearLayout.addView(textView); textView = new TextView(this); textView.setText("This TextView has the text color set on the object"); textView.setTextColor(Color.parseColor("#20808080")); linearLayout.addView(textView); } }
4.在TextView上设置自定义字体
我们可以先在Android Studio项目中的src |main
文件夹下创建一个资产目录,然后在TextView上设置自定义字体.ttf或者.otf字体文件。
。
现在,我们在资产文件夹中添加了一个.ttf文件。
我们的项目结构如下所示:
<TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:gravity="center" android:drawableLeft="@mipmap/ic_launcher" android:drawablePadding="16dp" android:textColor="@android:color/holo_red_dark"
setTypeface()用于设置自定义字体,它使用getAssets()文件夹调用资产目录。
第二个参数是字体文件的路径。
由于在我们的例子中,它存在于根目录中,因此路径只是文件名。
注意后者带有自定义字体的TextView!
5.在TextView上单击Listener
当使用TextView对象上的setOnClickListener单击TextView时,我们可以触发某些操作。
textView = new TextView(this); textView.setText("This TextView has Roboto font"); textView.setTypeface(Typeface.createFromAsset(getAssets(),"Roboto-Bold.ttf")); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); linearLayout.addView(textView);
为了使TextView具有单击功能,我们需要在xml中将android:clickable添加为true。
在MainActivity.java的onCreate方法中,我们执行以下操作。
<TextView android:id="@+id/textViewClickable" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:clickable="true"
使用xml属性android:onClick
的替代方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textViewClickable = findViewById(R.id.textViewClickable); textViewClickable.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { textViewClickable.setTextColor(Color.ORANGE); } }); }
使用ʻonClick`,我们设置每当单击TextView时在Java类中调用的方法名称。
<TextView android:id="@+id/textViewClickable" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:clickable="true" android:onClick="methodName"
6.在TextView中显示HTML
我们可以在TextView中显示html代码,如下所示。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textViewClickable = findViewById(R.id.textViewClickable); } public void methodName(){ textViewClickable.setTextColor(Color.ORANGE); }
7. TextView自动链接属性
autoLink属性用于检测TextView中的以下特定模式:
- 网路
- 地图地址
- 电子邮件地址
- 电话
- 所有
它将匹配的模式字符串转换为链接。
然后点击链接,就会发生相关行为(打开浏览器访问"网络",调用"电话",gmail访问"电子邮件",谷歌地图访问"地图")
让我们将其中一个TextView替换为以下内容:
textView.setText(Html.fromHtml( "<p>theitroad.local Android TextView Tutorial</p>"));