SQLite清空表并将自增列归零

SQL标准中有**TRUNCATE TABLE**语句,用来清空表的所有内容。但SQLite不支持这个语句。在SQLite中直接使用“**DELETE FROM TableName**”就可以了。对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。 SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:“When the WHERE is omitted(略去) from a DELETE statement and the table being deleted has no triggers(触发器), SQLite uses an optimization(优化) to erase the entire table content without having to visit each row of the table individually. **This “truncate” optimization makes the delete run much faster**.” 通常在清空表的时候,还需要把自增列归零。在SQLite中定义自增列的方法如下: <div id="crayon-51c50d9e7aa71" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aa71-1" class="crayon-line"> <span class="k">CREATE</span> <span class="k">TABLE</span> <span class="e">TableName </span><span class="sy">(</span> <span class="i">id</span> <span class="k">INTEGER</span> <span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="i">AUTOINCREMENT</span><span class="sy">,</span> <span class="sy">.</span><span class="sy">.</span><span class="sy">.</span> <span class="sy">)</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。 <div id="crayon-51c50d9e7aa8a" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aa8a-1" class="crayon-line"> <span class="k">UPDATE</span> <span class="i">sqlite_sequence</span> <span class="k">SET</span> <span class="i">seq</span> <span class="o">=</span> <span class="cn"></span> <span class="k">WHERE</span> <span class="i">name</span> <span class="o">=</span> <span class="s">&#8216;TableName&#8217;</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 也可以直接把该记录删掉: <div id="crayon-51c50d9e7aab0" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aab0-1" class="crayon-line"> <span class="k">DELETE</span> <span class="k">FROM</span> <span class="i">sqlite_sequence</span> <span class="k">WHERE</span> <span class="i">name</span> <span class="o">=</span> <span class="s">&#8216;TableName&#8217;</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> 要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了: <div id="crayon-51c50d9e7aac0" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes"> <div class="crayon-toolbar"> <div class="crayon-tools"> <span class="crayon-language">Transact-SQL</span> </div> </div> <div class="crayon-plain-wrap"> </div> <div class="crayon-main"> <table class="crayon-table "> <tr class="crayon-row"> <td class="crayon-nums "> <div class="crayon-nums-content"> <div class="crayon-num"> 1 </div> </div> </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-51c50d9e7aac0-1" class="crayon-line"> <span class="k">DELETE</span> <span class="k">FROM</span> <span class="i">sqlite_sequence</span><span class="sy">;</span> </div> </div> </td> </tr> </table> </div> </div> &nbsp; </div> 来自:http://zhuyanfeng.com/archives/516 ...

2016年8月15日 · 2 分钟 · 天边的星星

我的Android进阶之旅——>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类

下面是一个android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确 import Java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import java.util.Map.Entry; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * 忽略Https证书是否正确的Https Post请求工具类 * &lt;p/&gt; * created by OuyangPeng on 2016/1/17. */ public class HttpUtil { private static final String DEFAULT_CHARSET = "UTF-8"; // 默认字符集 private static final String _GET = "GET"; // GET private static final String _POST = "POST";// POST /** * 初始化http请求参数 */ private static HttpURLConnection initHttp(String url, String method, Map&lt;String, String&gt; headers) throws IOException { URL _url = new URL(url); HttpURLConnection http = (HttpURLConnection) _url.openConnection(); // 连接超时 http.setConnectTimeout(25000); // 读取超时 --服务器响应比较慢,增大时间 http.setReadTimeout(25000); http.setRequestMethod(method); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) [chrome](http://www.07net01.com/tags-chrome-0.html)/33.0.1750.146 Safari/537.36"); if (null != headers && !headers.isEmpty()) { for (Entry&lt;String, String&gt; entry : headers.entrySet()) { http.setRequestProperty(entry.getKey(), entry.getValue()); } } http.setDoOutput(true); http.setDoInput(true); http.connect(); return http; } /** * 初始化http请求参数 */ private static HttpsURLConnection initHttps(String url, String method, Map&lt;String, String&gt; headers) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { TrustManager[] tm = {new MyX509TrustManager()}; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL _url = new URL(url); HttpsURLConnection http = (HttpsURLConnection) _url.openConnection(); // 设置域名校验 http.setHostnameVerifier(new TrustAnyHostnameVerifier()); http.setSSLSocketFactory(ssf); // 连接超时 http.setConnectTimeout(25000); // 读取超时 --服务器响应比较慢,增大时间 http.setReadTimeout(25000); http.setRequestMethod(method); http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); http.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); if (null != headers && !headers.isEmpty()) { for (Entry&lt;String, String&gt; entry : headers.entrySet()) { http.setRequestProperty(entry.getKey(), entry.getValue()); } } http.setDoOutput(true); http.setDoInput(true); http.connect(); return http; } /** * get请求 */ public static String get(String url, Map&lt;String, String&gt; params, Map&lt;String, String&gt; headers) { StringBuffer bufferRes = null; try { HttpURLConnection http = null; if (isHttps(url)) { http = initHttps(initParams(url, params), _GET, headers); } else { http = initHttp(initParams(url, params), _GET, headers); } InputStream in = http.getInputStream(); BufferedReader read = new BufferedReader(new InputStreamReader(in, DEFAULT_CHARSET)); String valueString = null; bufferRes = new StringBuffer(); while ((valueString = read.readLine()) != null) { bufferRes.append(valueString); } in.close(); if (http != null) { http.disconnect();// 关闭连接 } return bufferRes.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * get请求 */ public static String get(String url) { return get(url, null); } /** * get请求 */ public static String get(String url, Map&lt;String, String&gt; params) { return get(url, params, null); } /** * post请求 */ public static String post(String url, String params, Map&lt;String, String&gt; headers) { StringBuffer bufferRes = null; try { HttpURLConnection http = null; if (isHttps(url)) { http = initHttps(url, _POST, headers); } else { http = initHttp(url, _POST, headers); } OutputStream out = http.getOutputStream(); out.write(params.getBytes(DEFAULT_CHARSET)); out.flush(); out.close(); InputStream in = http.getInputStream(); BufferedReader read = new BufferedReader(new InputStreamReader(in, DEFAULT_CHARSET)); String valueString = null; bufferRes = new StringBuffer(); while ((valueString = read.readLine()) != null) { bufferRes.append(valueString); } in.close(); if (http != null) { http.disconnect();// 关闭连接 } return bufferRes.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * post请求 */ public static String post(String url, Map&lt;String, String&gt; params) { return post(url, map2Url(params), null); } /** * post请求 */ public static String post(String url, Map&lt;String, String&gt; params, Map&lt;String, String&gt; headers) { return post(url, map2Url(params), headers); } /** * 初始化参数 */ public static String initParams(String url, Map&lt;String, String&gt; params) { if (null == params || params.isEmpty()) { return url; } StringBuilder sb = new StringBuilder(url); if (url.indexOf("?") == -1) { sb.append("?"); } sb.append(map2Url(params)); return sb.toString(); } /** * map转url参数 */ public static String map2Url(Map&lt;String, String&gt; paramToMap) { if (null == paramToMap || paramToMap.isEmpty()) { return null; } StringBuffer url = new StringBuffer(); boolean isfist = true; for (Entry&lt;String, String&gt; entry : paramToMap.entrySet()) { if (isfist) { isfist = false; } else { url.append("&"); } url.append(entry.getKey()).append("="); String value = http://blog.csdn.net/ouyang_peng/article/details/entry.getValue(); if (null == value || "".equals(value.trim())) { try { url.append(URLEncoder.encode(value, DEFAULT_CHARSET)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } return url.toString(); } /** * 检测是否https */ private static boolean isHttps(String url) { return url.startsWith("https"); } /** * 不进行主机名确认 */ private static class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } /** * 信任所有主机 对于任何证书都不做SSL检测 * 安全验证机制,而Android采用的是X509验证 */ private static class MyX509TrustManager implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } } ...

2016年8月10日 · 4 分钟 · 天边的星星

ButterKnife:8.1.0的使用

https://github.com/JakeWharton/butterknife 最近使用的新版的ButterKnife,跟之前有点不一样的地方。记录一下! 导入依赖项:Project Structure→app→Dependencies→add→Library Dependence然后搜索ButterKnife导入对应的依赖。 需要添加的一些插件 Project的build.gradle文件中增加classpath内容: ``` buildscript { repositories { jcenter() } dependencies { classpath &lt;span class="hljs-symbol">'com&lt;/span>.android.tools.build:gradle:&lt;span class="hljs-number">2.0&lt;/span>&lt;span class="hljs-number">.0&lt;/span>' classpath &lt;span class="hljs-symbol">'com&lt;/span>.neenbedankt.gradle.plugins:android-apt:&lt;span class="hljs-number">1.8&lt;/span>' &lt;span class="hljs-comment">//增加这一句&lt;/span> } } allprojects { repositories { jcenter() } } task clean(&lt;span class="hljs-class">&lt;span class="hljs-keyword">type&lt;/span>:&lt;/span> &lt;span class="hljs-type">Delete&lt;/span>) { delete rootProject.buildDir } 2. app的build.gradle文件中增加classpath内容: ``` `apply plugin: &lt;span class="hljs-string">'com.neenbedankt.android-apt'&lt;/span>&lt;span class="hljs-comment">//增加这一句&lt;/span> dependencies { compile fileTree(&lt;span class="hljs-keyword">include&lt;/span>: [&lt;span class="hljs-string">'*.jar'&lt;/span>], dir: &lt;span class="hljs-string">'libs'&lt;/span>) testCompile &lt;span class="hljs-string">'junit:junit:4.12'&lt;/span> compile &lt;span class="hljs-string">'com.android.support:appcompat-v7:23.4.0'&lt;/span> compile &lt;span class="hljs-string">'com.jakewharton:butterknife:8.1.0'&lt;/span> apt &lt;span class="hljs-string">'com.jakewharton:butterknife-compiler:8.1.0'&lt;/span>&lt;span class="hljs-comment">//增加这一句&lt;/span> }` 代码中的使用,具体就是之前的inject变成了现在的bind,其他变化不大: ``` `public <span class=“hljs-class”><span class=“hljs-keyword”>class</span> <span class=“hljs-title”>MainActivity</span> <span class=“hljs-keyword”><span class=“hljs-keyword”>extends</span></span> <span class=“hljs-title”>AppCompatActivity</span> {</span> <span class=“hljs-annotation”>@BindView</span>(<span class=“hljs-type”>R</span>.id.btn_qq) <span class=“hljs-type”>Button</span> qqBtn; <span class=“hljs-annotation”>@Override</span> <span class=“hljs-keyword”>protected</span> void onCreate(<span class=“hljs-type”>Bundle</span> savedInstanceState) { <span class=“hljs-keyword”>super</span>.onCreate(savedInstanceState); setContentView(<span class=“hljs-type”>R</span>.layout.activity_main); ...

2016年8月10日 · 1 分钟 · 天边的星星

隐藏弹出键盘,Edittext有光标实现方式

1、第一种方式 edittext.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); edittext.setTextIsSelectable(true); 2、第二种方式 /** * 禁止Edittext弹出软件盘,光标依然正常显示。 */ public void disableShowSoftInput(EditText editText) { if (android.os.Build.VERSION.SDK_INT &lt;= 10) { // editText.setInputType(InputType.TYPE_NULL); editText.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE); editText.setTextIsSelectable(true); } else { Class&lt;EditText&gt; cls = EditText.class; Method method; try { method = cls.getMethod("setShowSoftInputOnFocus",boolean.class); method.setAccessible(true); method.invoke(editText, false); }catch (Exception e) { // TODO: handle exception } try { method = cls.getMethod("setSoftInputShownOnFocus",boolean.class); method.setAccessible(true); method.invoke(editText, false); }catch (Exception e) { // TODO: handle exception } } }

2016年8月3日 · 1 分钟 · 天边的星星

Android 监听锁屏/开屏事件

1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 ### 2. BroadcastReceiver {#articleHeader1} #### 2.1. 事件 总共有3个事件: Intent.ACTION_SCREEN_ON : 屏幕点亮 Intent.ACTION_SCREEN_OFF :屏幕关闭 Intent.ACTION_USER_PRESENT: 用户解锁 #### 2.2. 权限 监听用户解锁需要在AndroidManifest中注册权限 &lt;uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /&gt; #### 2.3. IntentFilter代码 if (mContext != null) { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_USER_PRESENT); mContext.registerReceiver(mScreenReceiver, filter); } ### 3. PowerManager {#articleHeader2} PowerManager manager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); if (manager.isScreenOn()) { if (mScreenStateListener != null) { mScreenStateListener.onScreenOn(); } } else { if (mScreenStateListener != null) { mScreenStateListener.onScreenOff(); } } ...

2016年8月2日 · 4 分钟 · 天边的星星

Fragment销毁时replace和add两个方法的区别

这个首先从一个bug说起,如图: 我们都知道fragment切换有两种方式: replace方式 transaction.replace(R.id.content, IndexFragment); add-hide-show方式 transaction.add(R.id.content, IndexFragment); transaction.hide(otherfragment); transaction.show(thisfragment); 而上面按钮中出现bug的就是采用第二种方式。然后我们来分析下用add,hide,show为什么出现这种bug,我把每个操作都打印出了以下日志: 复现bug的操作是: 1.首先打开,默认选中的是第一个tab,如上面的一张图片正常那样。 2.切换到tab2,并把tab1 hide掉; 3.再切回到tab1,并不会触发tab1对应fragment的任何生命周期; 4.然后home键进入后台,我在activity的onPause()中手动对IndexFragment赋空,模拟长时间后台,系统销毁了该引用。 IndexFragment=null; 5.再次启动,其实tab1 的fragment实例在内存中还在,只是他的引用被销毁了。 6.再切到tab2,这里其实是先把tab1的hide,在show tab2,但是tab1 的fragment引用为空,所以无法hide,就出现了tab2叠在tab1上的花屏情况。 7.再切到tab1,tab1就会重复创建对象。 同样的操作,我们使用replace的方式 使用replace方式,虽然这种方式会避免上述的bug,但也是重复创建了对象。因为replace方式,对应的FrameLayout只有一 层,而add方式,这个FrameLayout其实有2层。但是这种方式的缺点是:每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据。 那么最合适的处理方式是这样的: 1.在add的时候,加上一个tab参数 transaction.add(R.id.content, IndexFragment,”Tab1″); 2.然后当IndexFragment引用被回收置空的话,先通过 IndexFragment=FragmentManager.findFragmentByTag(“Tab1″); 找到对应的引用,然后继续上面的hide,show;

2016年7月27日 · 1 分钟 · 天边的星星

Android EditText禁止输入中文字符

只允许EditText输入数字或者email格式字符是非常简单的(详见API文档)。 要实现只允许输入自定的数字字符也是很容易的(详见API文档,[setKeyListener(KeyListener)](http://blog.csdn.net/reference/android/widget/TextView.html#setKeyListener(android.text.method.KeyListener)) 和<span class="sympad">setFilters</span> <span class="normal">([InputFilter[]](http://blog.csdn.net/reference/android/text/InputFilter.html) filters)</span> )。 但是要限制只能输入指定的字母字符就非常的困难。 /** InputFilter[] ifs = {new InputFilter.LengthFilter(10),new DigitsKeyListener(true,true)}; editText01.setFilters(ifs); **/ &nbsp; 发现,**[Android](http://lib.csdn.net/base/15):digits**的参数是一个字符串,没有更多的语义检查,因此想到内部处理很可能仅是简单的检查,输入的字符是否在给定的字符串中(要我设计,我就这样做)。尝试着给它指定带有英文字符的参数,发现果然如此。万幸,万幸! 在layout.xml里 **[xml]** [view plain](http://blog.csdn.net/jdsjlzx/article/details/6762751#) [copy](http://blog.csdn.net/jdsjlzx/article/details/6762751#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> </div> - <span class="tag"><</span><span class="tag-name">EditText</span> - <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/register_userName_editText&#8221;</span> - <span class="attribute">style</span>=<span class="attribute-value">&#8220;@style/register_editText_style&#8221;</span> - <span class="attribute">android:digits</span>=<span class="attribute-value">&#8220;@string/register_name_digits&#8221;</span> - <span class="attribute">android:textColor</span>=<span class="attribute-value">&#8220;@drawable/register_edit_text_textColor&#8221;</span> - <span class="attribute">android:textColorHint</span>=<span class="attribute-value">&#8220;@drawable/register_hint_text_textColor&#8221;</span> - <span class="attribute">android:hint</span>=<span class="attribute-value">&#8220;@string/register_name_hint_text&#8221;</span> - <span class="tag">/></span> &nbsp; 在string.xml里 &nbsp; **[xml]** [view plain](http://blog.csdn.net/jdsjlzx/article/details/6762751#) [copy](http://blog.csdn.net/jdsjlzx/article/details/6762751#) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> </div> - <span class="tag"><</span><span class="tag-name">string</span> <span class="attribute">name</span>=<span class="attribute-value">&#8220;register_name_digits&#8221;</span><span class="tag">></span> - - ._0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLIMNOPQRSTUVWXYZ - - <span class="tag"></</span><span class="tag-name">string</span><span class="tag">></span> &nbsp; &nbsp; &nbsp; &nbsp; Java代码 - editText01.addTextChangedListener(<span class="keyword">new</span> TextWatcher() { - String tmp = <span class="string">&#8220;&#8221;</span>; - String digits = <span class="string">&#8220;abcdef&#8221;</span>; - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onTextChanged(CharSequence s, <span class="keyword">int</span> start, <span class="keyword">int</span> before, <span class="keyword">int</span> count) { - } - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> beforeTextChanged(CharSequence s, <span class="keyword">int</span> start, <span class="keyword">int</span> count, <span class="keyword">int</span> after) { - tmp = s.toString(); - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> afterTextChanged(Editable s) { - Log.d(Sample4Main.TAG, <span class="string">&#8220;<><>afterTextChanged<><>&#8221;</span> + s.toString()); - - String str = s.toString(); - <span class="keyword">if</span>(str.equals(tmp)){ - <span class="keyword">return</span>; - } - - StringBuffer sb = <span class="keyword">new</span> StringBuffer(); - <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number"></span>; i < str.length(); i++){ - <span class="keyword">if</span>(digits.indexOf(str.charAt(i)) >= <span class="number"></span>){ - sb.append(str.charAt(i)); - } - } - tmp = sb.toString(); - editText01.setText(tmp); - } - });

2016年7月20日 · 2 分钟 · 天边的星星

【Android】自定义控件让TextView的drawableLeft与文本一起居中显示

前言 TextView的drawableLeft、drawableRight和drawableTop是一个常用、好用的属性,可以在文本的上下左右放置一个图片,而不使用更加复杂布局就能达到,我也常常喜欢用RadioButton的这几个属性实现很多效果,但是苦于不支持让drawbleLeft与文本一起居中,设置gravity为center也无济于事,终于有空研究了一下,这里与大家一起分享。 声明 欢迎转载,请注明出处! 博客园:http://www.cnblogs.com/ 农民伯伯: http://www.cnblogs.com/over140/ 正文 一、效果图 二、实现代码 自定义控件 ![复制代码](http://common.cnblogs.com/images/copycode.gif) /** * drawableLeft与文本一起居中显示 * * @author 农民伯伯 * @see http://www.cnblogs.com/over140/p/3464348.html * */ public class DrawableCenterTextView extends TextView { public DrawableCenterTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public DrawableCenterTextView(Context context, AttributeSet attrs) { super(context, attrs); } public DrawableCenterTextView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Drawable[] drawables = getCompoundDrawables(); if (drawables != null) { Drawable drawableLeft = drawables[0]; if (drawableLeft != null) { float textWidth = getPaint().measureText(getText().toString()); int drawablePadding = getCompoundDrawablePadding(); int drawableWidth = 0; drawableWidth = drawableLeft.getIntrinsicWidth(); float bodyWidth = textWidth + drawableWidth + drawablePadding; } } super.onDraw(canvas); } } ...

2016年7月19日 · 1 分钟 · 天边的星星

Android share绘制虚线在手机上显示实线问题

可以说这是一个Bug, 据说在4.0以上机器会出现,我测试是android 4.4.2 Xml代码 <embed src="http://wv1124.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15"> </embed> <a title="收藏这段代码">![收藏代码](http://wv1124.iteye.com/images/icon_star.png)</a> </div> - <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span> - <span class="tag"><</span><span class="tag-name">shape</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> - <span class="attribute">android:shape</span>=<span class="attribute-value">&#8220;line&#8221;</span> <span class="tag">></span> - - <span class="tag"><</span><span class="tag-name">stroke</span> - <span class="attribute">android:dashGap</span>=<span class="attribute-value">&#8220;3dp&#8221;</span> - <span class="attribute">android:dashWidth</span>=<span class="attribute-value">&#8220;8dp&#8221;</span> - <span class="attribute">android:width</span>=<span class="attribute-value">&#8220;1dp&#8221;</span> - <span class="attribute">android:color</span>=<span class="attribute-value">&#8220;#999999&#8221;</span> <span class="tag">/></span> - - <span class="tag"><</span><span class="tag-name">size</span> <span class="attribute">android:height</span>=<span class="attribute-value">&#8220;1dp&#8221;</span> <span class="tag">/></span> - - <span class="tag"></</span><span class="tag-name">shape</span><span class="tag">></span> layout中引用: ...

2016年7月19日 · 2 分钟 · 天边的星星

InputStream与String,Byte之间互转

本文将介绍InputStream与String,Byte之间的相互转换。以代码来说明: **[html]** [view plain](http://blog.csdn.net/cjjky/article/details/6892443#) [copy](http://blog.csdn.net/cjjky/article/details/6892443#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - import java.io.ByteArrayInputStream; - import java.io.ByteArrayOutputStream; - import java.io.IOException; - import java.io.InputStream; - - /** - * - * @author Andy.Chen - * @mail Chenjunjun.ZJ@gmail.com - * - */ - public class InputStreamUtils { - - final static int <span class="attribute">BUFFER_SIZE</span> = <span class="attribute-value">4096</span>; - - /** - * 将InputStream转换成String - * @param in InputStream - * @return String - * @throws Exception - * - */ - public static String InputStreamTOString(InputStream in) throws Exception{ - - ByteArrayOutputStream <span class="attribute">outStream</span> = <span class="attribute-value">new</span> ByteArrayOutputStream(); - byte[] <span class="attribute">data</span> = <span class="attribute-value">new</span> byte[BUFFER_SIZE]; - int <span class="attribute">count</span> = -1; - while((<span class="attribute">count</span> = <span class="attribute-value">in</span>.read(data,0,BUFFER_SIZE)) != -1) - outStream.write(data, 0, count); - - <span class="attribute">data</span> = <span class="attribute-value">null</span>; - return new String(outStream.toByteArray(),&#8221;ISO-8859-1&#8243;); - } - - /** - * 将InputStream转换成某种字符编码的String - * @param in - * @param encoding - * @return - * @throws Exception - */ - public static String InputStreamTOString(InputStream in,String encoding) throws Exception{ - - ByteArrayOutputStream <span class="attribute">outStream</span> = <span class="attribute-value">new</span> ByteArrayOutputStream(); - byte[] <span class="attribute">data</span> = <span class="attribute-value">new</span> byte[BUFFER_SIZE]; - int <span class="attribute">count</span> = -1; - while((<span class="attribute">count</span> = <span class="attribute-value">in</span>.read(data,0,BUFFER_SIZE)) != -1) - outStream.write(data, 0, count); - - <span class="attribute">data</span> = <span class="attribute-value">null</span>; - return new String(outStream.toByteArray(),&#8221;ISO-8859-1&#8243;); - } - - /** - * 将String转换成InputStream - * @param in - * @return - * @throws Exception - */ - public static InputStream StringTOInputStream(String in) throws Exception{ - - ByteArrayInputStream <span class="attribute">is</span> = <span class="attribute-value">new</span> ByteArrayInputStream(in.getBytes(&#8220;ISO-8859-1&#8221;)); - return is; - } - - /** - * 将InputStream转换成byte数组 - * @param in InputStream - * @return byte[] - * @throws IOException - */ - public static byte[] InputStreamTOByte(InputStream in) throws IOException{ - - ByteArrayOutputStream <span class="attribute">outStream</span> = <span class="attribute-value">new</span> ByteArrayOutputStream(); - byte[] <span class="attribute">data</span> = <span class="attribute-value">new</span> byte[BUFFER_SIZE]; - int <span class="attribute">count</span> = -1; - while((<span class="attribute">count</span> = <span class="attribute-value">in</span>.read(data,0,BUFFER_SIZE)) != -1) - outStream.write(data, 0, count); - - <span class="attribute">data</span> = <span class="attribute-value">null</span>; - return outStream.toByteArray(); - } - - /** - * 将byte数组转换成InputStream - * @param in - * @return - * @throws Exception - */ - public static InputStream byteTOInputStream(byte[] in) throws Exception{ - - ByteArrayInputStream <span class="attribute">is</span> = <span class="attribute-value">new</span> ByteArrayInputStream(in); - return is; - } - - /** - * 将byte数组转换成String - * @param in - * @return - * @throws Exception - */ - public static String byteTOString(byte[] in) throws Exception{ - - InputStream <span class="attribute">is</span> = <span class="attribute-value">byteTOInputStream</span>(in); - return InputStreamTOString(is); - } - - }

2016年7月18日 · 2 分钟 · 天边的星星