public boolean vd(String str){ char[] chars=str.toCharArray(); boolean isGB2312=false; for(int i=0;i<chars.length;i++){ byte[] bytes=(""+chars[i]).getBytes(); if(bytes.length==2){ int[] ints=new int[2]; ints[0]=bytes[0]& 0xff; ints[1]=bytes[1]& 0xff; if(ints[0]>=0x81 && ints[0]<=0xFE && ints[1]>=0x40 && ints[1]<=0xFE){ isGB2312=true; break; } } } return isGB2312; }
首先要import java.util.regex.Pattern 和 java.util.regex.Matcher
这两个包,接下来是代码
public boolean isNumeric(String str) { Pattern pattern = Pattern.compile(”[0-9]*”); Matcher isNum = pattern.matcher(str); if( !isNum.matches() ) { return false; } return true; } java.lang.Character.isDigit(ch[0])
-----------------另一种-----------------
public static void main(String[] args) { int count = 0; String regEx = "[\\u4e00-\\u9fa5]"; //System.out.println(regEx); String str = "中文fdas "; //System.out.println(str); Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); while (m.find()) { for (int i = 0; i <= m.groupCount(); i++) { count = count + 1; } } System.out.println("共有 " + count + "个 "); }
-------------------------------
判断java String中是否有汉字的方法
java用的是Unicode 编码char 型变量的范围是0-65535 无符号的值,可以表示 65536个字符,基本上地球上的字符可被全部包括了,实际中,我们希望判断一个字符是不是汉字,或者一个字符串里的字符是否有汉字来满足业务上的需求,String类中有个这样的方法可得到其字符长度length() ,看下面例子,
String s1 = "我是中国人"; String s2 = "imchinese"; String s3 = "im中国人"; System.out.println(s1+":"+new String(s1).length()); System.out.println(s2+":"+new String(s2).length()); System.out.println(s3+":"+new String(s3).length());
OUTPUT:
我是中国人:5
imchinese:9
im中国人:5
看到了吧,字符串里如果有双字节的字符java就把每个字符都按双字节编码,如果都是单字节的字符就按单字节编码
于是按照以上的规律,结合一位QQ昵称 ?G茶?I珠海 兄的提示由以下解决方法,就是判断字符串的长度和字符字节的长度是否相同来判断是否有双字节的字符
System.out.println((s1.getBytes().length == s1.length())?"s1无汉字":"s1有汉字"); System.out.println((s2.getBytes().length == s2.length())?"s2无汉字":"s2有汉字"); System.out.println((s3.getBytes().length == s3.length())?"s3无汉字":"s3有汉字");
OUTPUT:
s1有汉字
s2无汉字
s3有汉字 //
且慢,这样诚然可以判断出来一个串中是否有双字节编码的字符,但是要精确判断是否有汉字就有些麻烦了,我们知道还有许多其他国家的字符在Unicode中是双字节的.
于是,需要进一步确定汉字的编码范围怎么确定呢,我用了一个本办法那就是现在记事本输出0-65535之间的字符,通过观察发现第一个汉字是'一'最后一个是'??'(现在我也不认识);这下好了判断汉字就容易多了比如我们可以通过比较字符的编码范围,最后给大家一些我试验的结果汉字基本集中在[19968,40869]之间,共有20901个汉字(是不是少了点,算算你能认识多少)
在做登录和注册页面的时候,经常会遇到诸如软键盘挡住输入框的情况,android为此提供了一系列的的配置参数供选择,你可以在androidmanufist.xml的对应Activity的windowSoftInputMode属性中选择如下4者之一进行配置(紫色字):
int SOFT_INPUT_ADJUST_NOTHING
Adjustment option for softInputMode:
set to have a window not adjust for a shown input method.
int SOFT_INPUT_ADJUST_PANAdjustment option for softInputMode:
set to have a window pan when an input method is shown, so it doesn't need to deal with resizing but just panned by
the framework to ensure the current input focus is visible.
int SOFT_INPUT_ADJUST_RESIZEAdjustment option for softInputMode:
set to allow the window to be resized when an input method is shown, so that its contents are not covered by the input method.
int SOFT_INPUT_ADJUST_UNSPECIFIEDAdjustment option for softInputMode:
nothing specified.
<activity android:name=".LoginAc"
android:label="@string/app_name"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
四个参数意思如下:
SOFT_INPUT_ADJUST_NOTHING: 不调整(输入法完全直接覆盖住,未开放此参数)
SOFT_INPUT_ADJUST_PAN: 把整个Layout顶上去露出获得焦点的EditText,不压缩多余空间,见图1
SOFT_INPUT_ADJUST_RESIZE: 整个Layout重新编排,重新分配多余空间,见图2
SOFT_INPUT_ADJUST_UNSPECIFIED: 系统自己根据内容自行选择上两种方式的一种执行(默认配置)
这里的多余空间指的是控件们通过weight分配机制得到的额外空间。
图1
图2
图3
代码实现方式为:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
但是,这样的配置方法一般都很难完全满足需要,有得应用会做得比较好,让顶上去的Layout能够通过scrollbar滚动。这种解决方法网上有各种介绍,本人也是第一时间从网上找解决方法参考,但最终发现都并未把原理说清,而且大多数有错误,或者有多余配置,于是,我从android系统中源码中找参考案例,在Email应用中,找到了我想要的。效果如图4,5。
图4
图5
其对应的Activity是AccountSetupBasics.java,对应的xml文件为account_setup_basics.xml。
来学习下它的xml写法:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:scrollbar > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <TextView android:id="@+id/instructions" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:textSize="20sp" android:text="@string/accounts_welcome" android:textColor="?android:attr/textColorPrimary" /> <View android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" /> <EditText android:id="@+id/account_email" android:hint="@string/account_setup_basics_email_hint" android:inputType="textEmailAddress" android:imeOptions="actionNext" android:layout_height="wrap_content" android:layout_width="fill_parent" /> <EditText android:id="@+id/account_password" android:hint="@string/account_setup_basics_password_hint" android:inputType="textPassword" android:imeOptions="actionDone" android:layout_height="wrap_content" android:layout_width="fill_parent" android:nextFocusDown="@+id/next" /> <CheckBox android:id="@+id/account_default" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/account_setup_basics_default_label" android:visibility="gone" /> <View android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" /> </LinearLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="54dip" android:background="@android:drawable/bottom_bar" > <Button android:id="@+id/manual_setup" android:text="@string/account_setup_basics_manual_setup_action" android:layout_height="wrap_content" android:layout_width="wrap_content" android:minWidth="@dimen/button_minWidth" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <Button android:id="@+id/next" android:text="@string/next_action" android:layout_height="wrap_content" android:layout_width="wrap_content" android:minWidth="@dimen/button_minWidth" android:drawableRight="@drawable/button_indicator_next" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> </RelativeLayout> </LinearLayout> </ScrollView>
1 它完全把ScrollView作为了一个根Layout,而不是网上好多文章写的在一个Linearlayout里面嵌入一个ScrollView(貌似这种是行不通的)。
然后把我们原来的根Layout搬入ScrollView(ScrollView只能有一个子控件),我查了下androidmanifist.xml和代码,未做任何以上2种方法的配置。
2 它定义了2个0dip的View帮助分配空间(设置其weight吃掉剩余空间,保证输入框处于界面中心位置),可以猜测出这里系统调用的是SOFT_INPUT_ADJUST_RESIZE参数,当所有有实际内容的控件空间总和超出特定范围时,ScrollView开始发挥作用。
如此,完美的解决我们遇到的问题。
另外,网上有人说想用SOFT_INPUT_ADJUST_RESIZE ,但又不希望背景图片被压缩,只要按如上方法把Linearlayout的背景图片设置好即可。
SDK升级到1.5以后,当文本输入框(EditText及其子类)获得焦点后,会弹出系统自带的软键盘
为了实现一些自定义的功能,就稍微研究了下
当layout中有多个EditText,把每个控件的android:singleLine的属性都被设置成true的情况下,软键盘的Enter键上的文字会变成“Next”,按下后下个EditText会自动获得焦点(实现了“Next”的功能);当最后一个控件获得焦点的时候,Enter键上的文字会变成“Done”,按下后软键盘会自动隐藏起来
把EditText的Ime Options属性设置成不同的值,Enter键上可以显示不同的文字或图案
actionNone : 回车键,按下后光标到下一行
actionGo : Go,
actionSearch : 一个放大镜
actionSend : Send
actionNext : Next
actionDone : Done,隐藏软键盘,即使不是最后一个文本输入框
(还有其他一些值可以设定,不过偷懒,没有看:-))
设置文本框的OnKeyListener,当keyCode = 66的时候,表明Enter键被按下,就可以编写自己希望的Action了