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了。