CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列。
曾经在学习中碰见两种获取常量的方式:
CharSequence chrs = getText(R.string.demo);
String str = getString(R.string.demo);
这两种方式有什么不同呢?一定要搞明白,开始实验:
实验一:strings.xml中的相关代码<string name="demo">demo</string>
main.xml中用线性布局定义两个文本标签,分别使用两种方式获取demo的值,详细代码
[html] view plain copy print ?
- <LinearLayoutxmlns: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">
-
- <TextView
- android:id="@+id/firstText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text=""/>
-
- <TextView
- android:id="@+id/secondText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text=""/>
-
- </LinearLayout>
<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" >
<TextView
android:id="@+id/firstText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<TextView
android:id="@+id/secondText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
注意android:text的值都是空的,下面继续看main.java是怎么处理的:
[java] view plain copy print ?
- package com.dy.study.firstbase;
-
- import android.os.Bundle;
- import android.widget.TextView;
- import android.app.Activity;
-
- public class Mainextends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- findViews();
-
- change();
- }
-
- private TextView firstText;
- private TextView secondText;
-
- private void findViews() {
- firstText = (TextView) findViewById(R.id.firstText);
- secondText = (TextView) findViewById(R.id.secondText);
- }
-
- private void change() {
- CharSequence chs = getText(R.string.demo);
- String str = getString(R.string.demo);
- firstText.setText(chs);
- secondText.setText(str);
- }
- }
package com.dy.study.firstbase;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
change();
}
private TextView firstText;
private TextView secondText;
private void findViews() {
firstText = (TextView) findViewById(R.id.firstText);
secondText = (TextView) findViewById(R.id.secondText);
}
private void change() {
CharSequence chs = getText(R.string.demo);
String str = getString(R.string.demo);
firstText.setText(chs);
secondText.setText(str);
}
}
好,看看实验一的结果:
可以看到,两个值完全一样,怎么回事?难道这两种方式的效果时完全一样的吗?先不忙下结论,继续实验。
实验二:把strings.xml中的那句相关代码改成<string name="demo"><b>demo</b></string>,仔细看,中间加了个<b></b>,然后其他都不改变,看结果:
你看,前面那个标签变了,这说明CharSequence的getText()是获取格式化的常量值,而String的getString()是单单获取值,而舍去了格式化。
就这么简单吗?可我又想了,如果把它们加起来,会是什么样子呢,继续实验。
实验三:在实验二的基础上改下main.java的内容:
main.java
[java] view plain copy print ?
- package com.dy.study.firstbase;
-
- import android.os.Bundle;
- import android.widget.TextView;
- import android.app.Activity;
-
- public class Mainextends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- findViews();
-
- change();
- }
-
- private TextView firstText;
-
- private void findViews() {
- firstText = (TextView) findViewById(R.id.firstText);
- }
-
- private void change() {
- CharSequence chs = getText(R.string.demo);
- String str = getString(R.string.demo);
- firstText.setText(chs + str);
- }
- }
package com.dy.study.firstbase;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
change();
}
private TextView firstText;
private void findViews() {
firstText = (TextView) findViewById(R.id.firstText);
}
private void change() {
CharSequence chs = getText(R.string.demo);
String str = getString(R.string.demo);
firstText.setText(chs + str);
}
}
这里只让显示标签一的内容,猜想一下是不是一个粗一个细呢?看结果:
被同化了,这让我想起了java的隐式转换,实验到此为止。