Android Studio中TextView

1. 基本属性与方法

xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

(1)textView1.setText();设置TextView内容

public class FirstActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    //底层是Activity,中层是Window,上层是View
        TextView textView1 = null; // 声明变量
        textView1 = (TextView) findViewById(R.id.textView1); // 获取对象

        textView1.setText(getString(R.string.hello));    //★获取strings.xml中的字符串资源

        textView1.setText("1234567890\n11111111.1\nabcdefghij\nABCDEFGHIJ\n一二三四五六七八九十零");
    }
}

请添加图片描述
(2)textView1.setTextSize();设置字体大小

textView1.setTextSize(20);

请添加图片描述
(3)设置颜色的两种方式,注意与布局文件中android:textColor="#f0f0f0"的区别

textView1.setTextColor(Color.RED); // 设置字体颜色
textView1.setBackgroundColor(Color.rgb(220, 220, 220)); // 设置背景颜色

请添加图片描述
(4)textView1.append();在TextView原有内容后添加内容

textView1.append("\n 本行是append添加的文字1234567890"); //注意空格在设为等宽字体后的变化
textView1.append("\n\n以下内容是从TextView对象中获取值:\n" + textView1.getText()); //获取文本框内容

请添加图片描述(5)设置等宽字体

textView1.setTypeface(Typeface.MONOSPACE); //设置等宽字体
textView1.setTypeface(Typeface.MONOSPACE, Typeface.BOLD); // 设置字体样式,等宽字体、加粗

请添加图片描述
(6)右对齐,等效于布局文件中的android:gravity=“right”

textView1.setGravity(Gravity.RIGHT);

请添加图片描述
(7)设置文本框高度

textView1.setHeight(500);

请添加图片描述
(8)设置最大显示行数,注意观察与上一条命令同时使用的变化
注意:如果设置了文本框高度,有以下两种情况
         (1)设置最大显示行数后,设置最大显示的行数高度超过文本框高度,如果文本框内容足够的话(内容高度>=上一句设置文本框高度),设置为几行显示几行,不受前一句文本框高度限制,会突破高度,但不会超过内容高度;如果文本框内容不够的话(内容高度<上一句设置文本框高度),内容全部显示,但文本框高度为上一句设置的高度,不会改变。
          (2)设置最大显示的行数高度没有超过文本框高度,无论内容足不足够,内容为设置几行显示几行,无内容用空白填充,文本框高度为上一句设置的高度,不改变。

textView1.setMaxLines(3);

请添加图片描述
(9)设置最少显示2行高度 或 android:minLines=“2”
注意:如果设置了文本框高度,有以下两种情况
         (1)设置最小显示行数后,设置最小显示的行数高度超过文本框高度,内容不论足不足够,不受前一句文本框高度限制,会突破高度,行数不足的用空白填补,设置多少行显示多少行。
         (2)设置最小显示行数后,设置最小显示的行数高度不超过文本框高度,内容足够(内容高度>=上一句设置文本框高度),高度为文本框高度;内容不够(内容高度<上一句设置文本框高度),高度为内容高度,文本框会被裁剪。

textView1.setText(“大学”);
textView1.setMinLines(2);

请添加图片描述
(10)设置显示文本上下左右内边距

textView1.setPadding(100,100,100,100);

请添加图片描述
(11)输出textView1的id的两种方法
注意:第一种是从文件中查找获取,第二种是从java文件中间接获取。

textView1.setText(“textView1的R.id.textView1为:” + R.id.textView1);
textView1.append("\ntextView1的getId为:" + textView1.getId());

请添加图片描述

2. theme与style

注意android:text中输出双引号方式
   1.将带双引号的字符串定义到strings.xml中,双引号前加反斜杠,如\"
   2.使用html(xml)字符 “&quot;”
style优先级高于theme,View控件中定义的属性优先级高于style

举个栗子:

style.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="style01">
		<item name="android:textSize">16sp</item>
		<item name="android:textColor">#0000FF</item>
	</style>
	<style name="style02">
		<item name="android:textSize">30sp</item>
		<item name="android:textColor">#000000</item>
	</style>
</resources>

main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="vertical">

	<!-- 使用sytle.xml中定义的样式@style/style01和@style/style02 -->
	<TextView
		android:id="@+id/TextView1"
		style="@style/style01"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="textSize:16sp, textColor:#0000FF" />

	<TextView
		android:id="@+id/TextView2"
		style="@style/style02"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="textSize:30sp, textColor:#000000" />


	<!--    使用android:theme代替style-->
	<TextView
		android:id="@+id/TextView3"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/textViewTheme"
		android:theme="@style/style01" />

	<TextView
		android:id="@+id/TextView4"
		style="@style/style02"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="&quot;style优先级高于theme&quot;"
		android:theme="@style/style01" />

	<TextView
		android:id="@+id/TextView5"
		style="@style/style02"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="View控件中定义的属性优先级高于style"
		android:textColor="@android:color/holo_red_dark"
		android:textSize="40dip" />

</LinearLayout>

运行结果如下:
请添加图片描述

3. layout_gravity与gravity的区别

android:layout_gravity是当前控件在父容器中的对齐,并不影响父容器中的其它控件对齐方式。
android:gravity是控件本身内容在本身内位置的设置。

举个栗子:
main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--注意layout_gravity与gravity的区别-->
	<TextView
		android:id="@+id/textView1"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:background="@android:color/holo_orange_light"
		android:gravity="right"
		android:text="match_parent + gravity=right"
		android:textSize="24sp" />

	<TextView
		android:id="@+id/textView2"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:background="#ffff00"
		android:gravity="right"
		android:text="wrap_content + gravity=right"
		android:textSize="24sp" />

	<TextView
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:layout_gravity="right"
		android:background="@android:color/holo_orange_light"
		android:text="wrap_content + layout_gravity=right"
		android:textSize="24sp" />
	
</LinearLayout>

运行结果如下:
请添加图片描述

  • 还可以通过java文件来设置控件的位置
/*
 * layout_gravity与gravity
 * ■显示结果还与android:layout_width的取值有关(match_parent|wrap_content)
 */
public class FirstActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //使用Java代码设置对齐方式
        TextView textView1 = (TextView) findViewById(R.id.textView1);
        textView1.setGravity(Gravity.CENTER);
//
//        将TextView控件在屏幕右侧对齐
//        ★要在布局文件中定义LinearLayout控件的id,Java中才能引用
		LinearLayout linearLayout1 = (LinearLayout) findViewById(R.id.lineLayout1);
		linearLayout1.setGravity(Gravity.RIGHT);
    }
}

/*
★用setGravity方法与android:gravity、android:layout_gravity的区别:
setGravity是控件内所有对象按指定方式对齐,等效于android:gravity。android:layout_gravity是当前控件在父容器中的对齐,并不影响父容器中的其它控件对齐方式。
 */

运行结果如下:
请添加图片描述

4. TextView文本变更监听器

举个栗子:

public class FirstActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView1 = null;

        textView1 = (TextView) findViewById(R.id.textView1);
        //jdk8以前版本必须要有final修饰,jdk8及以后版本只要符合“实际上的最终变量(不改变其值)”条件也可以不用final
        final TextView textView2 = (TextView) findViewById(R.id.textView2);
        /*
         * ★解决方法:
         * 1. 在onTextChanged()方法中声明实例化对象;
         * 2. 将textView2定义为final;
         * 3. 将textView2定义为全局对象
         * ★结论:如果内部类需要访问包含它的外部类方法或语句块的局部变量,
         * 则该局部变量必须定义为final或全局变量
         */

        textView1.setText("12345"); // 设置显示内容
        
        textView1.addTextChangedListener(new TextWatcher()
        {
            // 添加监听器
            @Override
            public void afterTextChanged(Editable s)
            { // 文本改变后
                Log.i("zhj", "执行afterTextChanged s=" + s);
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //文本改变前
                Log.i("zhj", "执行beforeTextChanged s=" + s + " start=" + start + " count=" + count + " after=" + after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //★注意以下三种输出信息方式
                Log.i("zhj", "执行onTextChanged s=" + s + " start=" + start + " before=" + before + " count=" + count);

                Toast.makeText(getApplicationContext(), "原字符串共" + String.valueOf(before) + "个字符。\n从第" + String.valueOf(start) + "个字符开始更改为字符串:" + s + "。\n共" + String.valueOf(count) + "字符。", Toast.LENGTH_LONG).show(); // 显示提示信息

                //在new TextWatcher()内调用textView2,需将textView2定义为final或全局变量,或者是在new TextWatcher()内声明TextView textView2
                textView2.append("\n原字符串共" + String.valueOf(before) + "个字符。\n从第" + String.valueOf(start) + "个字符开始更改为字符串:" + s + "。\n共" + String.valueOf(count) + "字符。");
            }
        });
     // textView1.setText("1234567890"); // 重设文本内容。此行命令须在定义监听器之后运行才能触发监听器。
       textView1.append("1234567890"); //注意运行时与上行的区别(显示两次,删除+赋值)
       //textView1.append("师大");  //注意汉字长度的计算

//        Log.i("zhj", textView1.getText()); //★此行出错,为什么?
/*textView1.getText()方法返回的是CharSequence接口,不能直接打印,要用它里面定义定义的toString方法或者其他方法。*/
        //可以替换为以下三种方式
        Log.i("zhj", String.valueOf(textView1.getText()));
        Log.i("zhj", textView1.getText().toString());
        Log.i("zhj", "结果=" + textView1.getText());

        //系统提示修改的以下方式会出错,父类转为子类,向下转型,错误。
//        Log.i("zhj", (String) textView1.getText());
    }
}

/*
Editable、CharSequence、String
★Editable 是一个 接口类型,对它的实例化对象作出任何改变都是对原有的实例化对象操作的,内存地址还是原来的那个。
而对 String 的任何改变都是相当于重新实例化了一个 String 类出来,相当于重新分配了内存地址。
所以说 Editable 变更文本之后还是原来的 Editable 对象,String 变了之后就已经不是原来的 String 对象了。
★CharSequence与String都能用于定义字符串,String是CharSequence的子类
    public final class String implements Serializable, Comparable, CharSequence {xxxxxx}
CharSequence是实现这个接口的实例 举例:
//父类引用指向子类对象
    CharSequence str = "abc"; 就是 CharSequence str = new String("abc");
    不能使用CharSequence str = new CharSequence("abc");
    CharSequence为接口。接口不能实例化。
 */ 

结果如下:
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值