Android TextView

时间:2020-02-23 14:29:21  来源:igfitidea点击:

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>"));