IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android实战技巧之一:文本与布局

    lincyang发表于 2012-02-14 21:43:07
    love 0

    //别看这个标题挺大,其实这次要说的只是3个小技巧。

    //2014.11.7 update

    1、字符串资源里变量替换

    工作中是拒绝硬编码的,android里会把一些字符串等放在xml中当做资源使用,如项目中values下的strings.xml列出了app_name.

    有些情况是这样的,程序中要使用的字符串如第345页,345是变量,那么我们不可能用两个字符串资源如

    <string name="di">第</string>
    <string name="page">页</string>

    在程序中拼接字符串。那么我们可能会想,在我们学习C的时候,有%s这样的神奇的符号,可以替换变量的格式化操作符。

    其实,在android中也有这样的东西,那就是XLIFF,全称叫XML本地化数据交换格式,英文全称XML Localization Interchange File Format。

    用法也是很简单的,如

    <string name="page">第%1$s页</string>

    程序中只要给变量赋值就可以了,如

    String page = getString(R.string.page,"345");
    那么,要是有多个变量呢,如第345页24行?这也好办,如下:

    <string name="page">第%1$s页%2$s行</string>
    String page = getString(R.string.page,"345","24");

    2、TextView中设置多种字体大小

    这是项目中经常遇到的,比如UI是这样的:

    Android实战技巧之文本与布局

    像这样的两种字体,要如何处理呢?需要用到android.text命名空间下的一些与spannable相关的类和接口。例子如:

    String text = "Android实战技巧之文本与布局";
    int start = text.indexOf('之');
    int end = text.length();
    Spannable textSpan = new Spannable(text);
    textSpan.setSpan(new AbsoluteSizeSpan(20),0,start,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textSpan.setSpan(new AbsoluteSizeSpan(12),start,end,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    这个textSpan就是你想要的。

    3、TextView的超链接

    这个很简单,在xml中属性autoLink=“all”。

    程序中TextView.setAutoLink(Linkify.ALL);

    说下参数:

    Linkify.EMAIL_ADDRESS -- 仅识别出TextView中的Email在址,标识为超链接,点击后会跳到Email,发送邮件给此地址
    Linkify.PHONE_NUMBERS -- 仅识别出TextView中的电话号码,标识为超链接,点击后会跳到Dialer,Call这个号码
    Linkify.WEB_URLS-- 仅识别出TextView中的网址,标识为超链接,点击后会跳到Browser打开此URL
    Linkify.ALL -- 这个选项是识别出所有系统所支持的特殊Uri,然后做相应的操作

    特殊情况:

    当一段文字部分是超链接或者我们需要点击超链接跳到另一个Activity时,如何处理?

    答案还是用Spannable。例子如下(摘自网络):

    public class MainActivity extends Activity {
    	private TextView testText;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		testText = (TextView) findViewById(R.id.testText);
    		//将TextView的显示文字设置为SpannableString
    		testText.setText(getClickableSpan());
    		//设置该句使文本的超连接起作用
    		testText.setMovementMethod(LinkMovementMethod.getInstance());
    	}
    
    	//设置超链接文字
    	private SpannableString getClickableSpan(){
    		SpannableString spanStr = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
    		//设置下划线文字
    		spanStr.setSpan(new UnderlineSpan(), 16, 20,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
    		//设置文字的单击事件
    		spanStr.setSpan(new ClickableSpan() {
    
    			@Override
    			public void onClick(View widget) {
    
    				startActivity(new Intent(MainActivity.this, TestActivity1.class));
    			}
    		}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    		//设置文字的前景色
    		spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 16, 20,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    		//设置下划线文字
    		spanStr.setSpan(new UnderlineSpan(), 21, 25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
    		//设置文字的单击事件
    		spanStr.setSpan(new ClickableSpan() {
    			
    			@Override
    			public void onClick(View widget) {
    				
    				startActivity(new Intent(MainActivity.this, TestActivity2.class));
    			}
    		}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    		//设置文字的前景色
    		spanStr.setSpan(new ForegroundColorSpan(Color.WHITE), 21, 25,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    		return spanStr;
    	}
    }

    4、布局中只在界面底部

    在大部分的android程序中,都会发现一个底部的菜单栏。这通常是一个线性布局加一些按钮。如何让其始终在底部,无论是哪个分辨率呢?

    这要用到关系布局的属性

    android:layout_alignParentBottom="true"
    在关系布局内部,如果把此属性设置true,就会在关系布局的底部了。

    这个用途还是很广泛的。

    5.EditText与软键盘

    当界面有EditText并且光标落在上面时,软键盘就会弹出。本来是为了方便,但有些情况这样挺讨厌的。比如登录界面。

    取消它只需要在Manifest文件中使用windowSoftInputMode即可,如下:

            <activity 
                android:name=".LoginActivity"
                android:label="@string/app_name"
    	    android:windowSoftInputMode="stateHidden|adjustResize"
                >

    6.布局的边框颜色

    // 2014.11.24 updated

    尝试一下用各种layout仿制listview,就是把layout的边框设置对应的颜色。

    在drawable下添加layer_list,

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item>
        <shape>
            <stroke android:width="3px" android:color="#ffff0000" /><!--边框颜色-->
            <solid android:color="#FFFCFCFC" /><!--填充色-->
            <corners android:radius="4dp" /><!--圆角-->
        </shape>
      </item>
    </layer-list>
    
    在layout中引用:

        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:orientation="vertical"
            android:background="@drawable/layout_bg"
            >
    

    //2014.11.27 update

    其他widget如ImageView的边框也可以像这样设置。

    7.Java文件中字体加粗

    //2015.1.12 update
    //Typeface
    textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
    //use TextPaint
    textView.getPaint().setFakeBoldText(true);




沪ICP备19023445号-2号
友情链接