当前位置:  编程技术>移动开发
本页文章导读:
    ▪SpannableStringBuilder 跟 SpannableString(转)        SpannableStringBuilder 和 SpannableString(转) EditText:         通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何.........
    ▪ 【转】UITableViewCell的重绘机制导致的列状态有关问题        【转】UITableViewCell的重绘机制导致的列状态问题 问题:UITableViewCell的重绘机制导致的列状态问题环境:XCode4.2,低版本也会出现场景:自定义UITableViewCell,使用复用cell方法,在UITableView滚.........
    ▪ 运用googleapi-client-java操作gtasks(二)       使用googleapi-client-java操作gtasks(二) 对于很多第三方的机器没有安装Google账户管理,要访问GTasks,那么可以使用OAuth 2.0的认证方式。OAuth 2.0的认证流程:1.得到授权码2.使用授权码获得真.........

[1]SpannableStringBuilder 跟 SpannableString(转)
    来源: 互联网  发布时间: 2014-02-18
SpannableStringBuilder 和 SpannableString(转)
EditText:
        通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢?
记得android中有个android.text包,这里提供了对文本的强大的处理功能。
添加图片主要用SpannableString和ImageSpan类:
     Drawable drawable = getResources().getDrawable(id);  
     drawable.setBounds(0, 0,
              drawable.getIntrinsicWidth(), 
              drawable.getIntrinsicHeight());  
        //需要处理的文本,[smile]是需要被替代的文本  
        SpannableString spannable = new SpannableString(getText().toString()
                                                    +"[smile]");  
        //要让图片替代指定的文字就要用ImageSpan  
        ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
        //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  
        //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  
        spannable.setSpan(span, getText().length(),getText().length()
                   +"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
        setText(spannable);  

        有的时候可能只想用一个textview来表示文字,但文字里肯定有分不同内容的东西,需要用不同的颜色、样式来表示.
        这个时候,就需要用到SpannableString对象来处理。
/**
  * new StrikethroughSpan() //设置删除线
  * new URLSpan("http://www.baidu.com")//http超链接
  * new URLSpan("tel:4155551212")//电话超链接
  */
mTextView = (TextView)findViewById(R.id.test);
SpannableString tSS = new SpannableString(“SpannableString学习中”);
tSS.setSpan(new BackgroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  //红色高亮
tSS.setSpan(new UnderlineSpan(), 15, 18,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    //下划线
tSS.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //斜体
mTextView.setText(tSS);


关键方法:
public void setSpan (Object what, int start, int end, int flags)
start是起始位置,无论中英文,都算一个。从0开始计算起。end是结束位置,所以处理的文字,包含开始位置,但不包含结束位置。

将需要的文字高亮显示:
public void highlight(int start,int end){  
        SpannableStringBuilder spannable=
              new SpannableStringBuilder(getText().toString());//用于可变字符串  
        ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span, start, 
                         end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
}  

加下划线:
public void underline(int start,int end){  
        SpannableStringBuilder spannable=
                  new SpannableStringBuilder(getText().toString());  
        CharacterStyle span=new UnderlineSpan();  
        spannable.setSpan(span, start, 
                  end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
}  

组合运用:
SpannableStringBuilder spannable=
        new SpannableStringBuilder(getText().toString());  
        CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC);  
        CharacterStyle span_2=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span_1, start, 
                      end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        spannable.setSpan(span_2, start, 
                      end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  

案例:带有\n换行符的字符串都可以用此方法显示2种颜色
 /** 
   * 带有\n换行符的字符串都可以用此方法显示2种颜色 
   * @param text 
   * @param color1 
   * @param color2 
   * @return 
   */  
   public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){  
       SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串  
       CharacterStyle span_0=null,span_1=null,span_2;  
       int end=text.indexOf("\n");  
       if(end==-1){//如果没有换行符就使用第一种颜色显示  
           span_0=new ForegroundColorSpan(color1);  
           spannable.setSpan(span_0, 0, 
                           text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
       }else{  
           span_0=new ForegroundColorSpan(color1);  
           span_1=new ForegroundColorSpan(color2);  
           spannable.setSpan(span_0, 0, 
                           end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
           spannable.setSpan(span_1, end+1, 
                           text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
           span_2=new AbsoluteSizeSpan(fontSize);//字体大小  
           spannable.setSpan(span_2, end+1, 
                           text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }  
       return spannable;  
   }

以上实际都是Html.fromHtml(html)的代码实现形式。
=============================================================================

TextView: (方法与EditView类似)
如何让一个TextView中的关键字高亮显示?
    /** 
     * 关键字高亮显示 
     * @param target 需要高亮的关键字 
     */  
    public void highlight(String target){  
        String temp=getText().toString();  
        SpannableStringBuilder spannable = new SpannableStringBuilder(temp);  
        CharacterStyle span=null;  
          
        Pattern p = Pattern.compile(target);  
        Matcher m = p.matcher(temp);  
        while (m.find()) {  
            span = new ForegroundColorSpan(Color.RED);//需要重复!
            //span = new ImageSpan(drawable,ImageSpan.XX);//设置现在图片
            spannable.setSpan(span, m.start(),  m.end(),
                              Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }  
        setText(spannable);  
    }

    
[2] 【转】UITableViewCell的重绘机制导致的列状态有关问题
    来源: 互联网  发布时间: 2014-02-18
【转】UITableViewCell的重绘机制导致的列状态问题
问题:UITableViewCell的重绘机制导致的列状态问题
环境:XCode4.2,低版本也会出现

场景:自定义UITableViewCell,使用复用cell方法,在UITableView滚动时,内容被覆盖,或者没有被刷新,或者选择时内容覆盖,或者设置cell的背景透明时,内容重叠在一起,或者图片控件出现覆盖,显示不全等问题。
原因:引起这个问题的主要原因是,重用cell。之前cell上的内容未被清空,而又增加新增内容所致。
:在使用cell时,首先删除cell上的view,代码如下。

static NSString *identifier = @"Fanmeli";
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
	if (!cell) {
		//cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier];
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }else{
        // 删除cell中的子对象,刷新覆盖问题。
        while ([cell.contentView.subviews lastObject] != nil) {
            [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
        }
    }
// 增加新内容
.... 



摘自:http://blog.csdn.net/ugg/article/details/7237902

    
[3] 运用googleapi-client-java操作gtasks(二)
    来源: 互联网  发布时间: 2014-02-18
使用googleapi-client-java操作gtasks(二)
对于很多第三方的机器没有安装Google账户管理,要访问GTasks,那么可以使用OAuth 2.0的认证方式。
OAuth 2.0的认证流程:
1.得到授权码
2.使用授权码获得真正的数据访问令牌

其中数据访问令牌一般有效期为60分钟,在得到此访问令牌的时候还会得到一个刷新令牌,当访问令牌过期后可以用此刷新令牌自动获得一个新的。

1.授权码的获得:
用浏览器打开一个url,这个url是由要访问的服务以及其他一些相关信息生成的。
/*
 * https://code.google.com/oauthplayground 可以找到一个scope列表。
 */
private final static String SCOPE = "https://www.googleapis.com/auth/tasks";
/*以下信息来自于https://code.google.com/apis/console
 *创建一个Project,然后选择要激活的Service,我激活了Calendar和Tasks API
 *选择API Access,可以设置OAuth 2.0,进而得到相关信息。
 *创建id时选择for installed applications。 
 */
private final static String CLIENT_ID = "你的id.apps.googleusercontent.com";
private final static String CLIENT_SECRET = "你的secret";
private static final String CALLBACK_URL = "urn:ietf:wg:oauth:2.0:oob";
    
private void requestAuthCode() {
	String authorizeUrl = new GoogleAuthorizationRequestUrl(/blog_article/CLIENT_ID, CALLBACK_URL, SCOPE/index.html).build();
    	Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(authorizeUrl));
    	startActivity(intent);
}

用户看到一个浏览器打开的页面,输入用户名和密码后就可以得到授权码,不过要手工复制一下,然后到程序中粘贴。
授权码是时刻在变的,即使是同一个设备同一个ap去获取同一个账户的授权码也是在变的。

2.数据访问令牌的获取
用授权码作为参数,获取后保存。
private boolean requestToken(String authCode) {
    GoogleAuthorizationCodeGrant authRequest = new GoogleAuthorizationCodeGrant(mTransport,
  		new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, authCode, CALLBACK_URL);
    authRequest.useBasicAuthorization = false;
    AccessTokenResponse authResponse;
	try {
		authResponse = authRequest.execute();	//发出请求
		mAccessToken = authResponse.accessToken;
		mRefreshToken = authResponse.refreshToken;
		return true;		
	} catch( HttpResponseException he) {
		he.printStackTrace();
		return false;
	} catch (IOException e) {
		e.printStackTrace();
		return false;
	} 
}


3.读取数据
使用token构造一个可以进行访问保护资源的对象。
然后构造一个Tasks对象。
执行tasks的execute()方法就可以获得数据了。
当获取数据时,token有可能过期,这个时候会得到401的响应值,此时需要刷新一下token,然后再获取数据。
if(mAccessProtectedResource == null) {
	mAccessProtectedResource = new GoogleAccessProtectedResource(mAccessToken,
							mTransport, new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, mRefreshToken);
				}
	if(mService == null) mService = new Tasks(mTransport, mAccessProtectedResource, new JacksonFactory());
	mTaskListNames.clear(); 
	try {
		List<TaskList> lists = mService.tasklists.list().execute().items;
		for(TaskList tl : lists) {
			mTaskListNames.add(tl.title);
		}
		mAdapter.notifyDataSetChanged();
	} catch(HttpResponseException he) {
		if(he.getResponse().getStatusCode() == 401) {
			//token 过期,刷新token
			try {
				mAccessProtectedResource.refreshToken();
				mAccessToken = mAccessProtectedResource.getAccessToken();
				mRefreshToken = mAccessProtectedResource.getRefreshToken();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	} catch (IOException e) {
	}


另外此种方法访问用户数据因为Client_ID没有改变,所以每个Ap的限额仍然是每日5000次,即使访问的是不同账户的数据。
那么解决限额的方法只能是交钱买更多的,或者Ap里面多内置几个Client_ID,随机选用了,当然这些Client_ID必须是隶属于不同账户的。
或者就好像(一)中提到的,让用户自己输入自己的API KEY,不过这个太专业了,一般人不好搞。
直接通过HttpClient走REST协议似乎可以不用client_id和api key,可参见:
https://code.google.com/apis/explorer 应该也不行,在获取授权码的时候就要client id

如果授权失败返回的错误码是401,如果是超限额返回的错误码是403。
另外如果使用proguard,那么要增加配置:
(来自于http://code.google.com/p/google-api-java-client/wiki/Setup)

# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection

-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

# Needed by Guava

-dontwarn sun.misc.Unsafe

# See https://groups.google.com/forum/#!topic/guava-discuss/YCZzeCiIVoI
-dontwarn com.google.common.collect.MinMaxPriorityQueue

PS:经试验task的title的长度最大为1024字节;note的最大长度为8192字节。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
Web服务器/前端 iis7站长之家
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3