浅谈Android控件赋值那些事

N年没写过东西,最近想学习Android,不是大佬,但又想装一下,所以只能写点简单的东西。今天就写点控件赋值那些事,本文以TextView为例,其他控件类似。


一、在布局xml中直接赋值
这是比较常用的方法,通常是对一些固定值,或者有一定规律的控件的赋值方法。

    android:id="@+id/txt_username"
    android:text="navyLiu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>



二、将字符串写在string.xml中,在xml中进行引用

也就是将真正要显示的字符串卸载string.xml文件中,在xml中进行引用

string.xml

name="username">navyLiu

xml

    android:id="@+id/txt_username"
    android:text="@string/username"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>



三、在Java文件中动态赋值

可能你不想在布局文件中赋值,觉得13格不够,可以在Java文件中进行动态赋值

TextView usernameTxt = (TextView)this.findViewById(R.id.txt_username);
usernameTxt.setText("navyLiu");
当然,稍有( 国学)常识者,都知道,前面两种可以进行套用( 牡丹游园一曲乃国之精粹)。于是就变成

TextView usernameTxt = (TextView)this.findViewById(R.id.txt_username);
usernameTxt.setText(R.string.username);
一下子Java文件中看不到一个中文(好像一直都没得),是不是一下提升了B格。



四、赋值拼接

以上都是一些醉醉基本的赋值,但常常都不是这种简单的,很多时候都需要将一个或者多个字符串拼接起来显示到控件中,那么这个时候有一个简单的+可以进行拼接,那么可以写成这样:

String usernameTitleStr = "姓名:";
String usernameStr = "navyLiu";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(usernameTitleStr + usernameStr);

可能有人要发问了,你这是就写在这里,那我能不能写在string.xml文件里面呢,答案是肯定的,

String usernameTitleStr = "姓名:";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(usernameTitleStr + R.string.username);
哈哈,上当了吧,显示出来根本就不是想要的,这是因为R.string.username是一个整型数字,拼接当然不行。那为什么答案是肯定的,因为这里可以使用占位符来实现,
String usernameStr = "姓名:%s";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(String.format(usernameStr, R.string.username));

有木有实现,

maybe你问题又来了,你要说这个放在这里逼格不高,想放到string.xml中,no problem:

TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(String.format(getResources().getString(R.string.username), "navyliu"));

咦,这不就可以完美的和服务器返回数据动态 显示了吗,对头,是这样的。



五、HTML赋值,这个好像过时了,不推荐

对于热衷HTML的我来说,最开始是情有独钟的,因为他可以方便让我赋值内容进行颜色,大小进行变化,可以支持一些简单的HTML标签

TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(Html.fromHtml("navyLiu"));

也有说法有替代方法:

TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
   usernameTxt.setText(Html.fromHtml("navyLiu", Html.FROM_HTML_MODE_LEGACY));
}else{
   usernameTxt.setText(Html.fromHtml("navyLiu"));
}



六、超能(不是明星经纪公司哦)的StringBuilder 赋值

TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
StringBuilder builder = new StringBuilder();
builder.append("姓名:navyliu");
usernameTxt.setText(builder);
当然,这里you也可以结合前面的占位符来使用:

String usernameStr = "navyliu";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
StringBuilder builder = new StringBuilder();
builder.append(String.format("姓名:%s", usernameStr));
usernameTxt.setText(builder);



七、大神SpannableStringBuilder  

SpannableStringBuilder 的出现,是不是让你浮想联翩,没错,你现在可以为所欲为了,不管是字体颜色,大小还是你想在其中穿插图片,让你感受真实的没有做不到,只有想不到,这可是真正的高手
String usernameTitleStr = "姓名:";
String usernameStr = "navyliu";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(String.format("%s%s", usernameTitleStr, usernameStr))
      .setSpan(new ForegroundColorSpan(Color.GREEN), usernameTitleStr.length() - 1
            , usernameTitleStr.length() + usernameStr.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
usernameTxt.setText(builder);



八、外挂SpanUtils

有大神在GitHub上写了一些code,可以方便快捷的实现SpannableStringBuilder  的功能

String usernameTitleStr = "姓名:";
String usernameStr = "navyliu";
TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(new SpanUtils()
      .append(usernameTitleStr).setFontXProportion(2)
      .append(usernameStr).setForegroundColor(Color.GREEN)
      .create());



九、没啥子写的了,凑个数,再说一下(吓)占位符

占位符可以更方便的实现赋值,不用太多的格式转换

常用的占位符有三个:

a、%s  字符串 
b、%d  整数
c、%f  浮点


占位符不但可以提升逼格,而且还有更高级的使用,比如显示RMB可以用%.02f来作为占位符,这样的话我们是不是就可以不用烦恼RMB的两位小数了。

TextView usernameTxt = (TextView) this.findViewById(R.id.txt_username);
usernameTxt.setText(String.format("navyliu的银行存款有%.02f元", 99999999999999999999999999999999999999.0));

eg2:

你是不是还在为datepicker返回的日期,进行if(day<9)的判断,有了占位符,不用再烦恼,一行代码搞定,正确的姿势

private DatePickerDialog.OnDateSetListener onDateSetListencer = new DatePickerDialog.OnDateSetListener() {
   @Override
   public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
      ToastUtils.showShort(String.format("%d-%02d-%02d", year, month + 1, dayOfMonth));
   }
};




十、该睡觉了,没有shi了。

你可能感兴趣的:(android)