对于Android 4.0 SDK中提供的Beam例子,对于NFC开发来说的确是一个不错的模板。对于了解NFC的NDEF消息处理过程不妨看下面的代码。 public class Beam extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; TextView mInfoText; private static final int MESSAGE_SENT = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mInfoText = (TextView) findViewById(R.id.textView); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); //实例化NFC设备 if (mNfcAdapter == null) { mInfoText = (TextView) findViewById(R.id.textView); mInfoText.setText("NFC is not available […]
软件应用教程
Android程序运行性能优化 Android开发技术
对于Android手机来说,由于Google全面开放多任务同时运行着Java这样的解释型语言导致对RAM的开销很大,随着Android平台的发展很多新手程序员在经验等问题,会导致你的应用执行效率较低。针对于发布版应用应该注意以下几点: 一、慎用Logcat输出 如果你的应用总是在后台不断的输出Log.i或Log.d的内容,除了增加系统开销外,对你应用的整体效率受影响,尤其是持续输出很多内容。由于Log需要底层的JNI调用,对Java虚拟机的开销来说还是不小的。 二、ProGuard扰码器 对于Android应用加密,扰码器可能除了修改类和变量的名称外,增加算法复杂难度,可能出现本身1+1=2的问题变为了2*10-10-8这样的情况,当然Android123是举个例子来说明扰码器的工作原理,这对于程序的运行效率和部分逻辑可能会改变,所以这点要权衡配置扰码器是否仅修改变量名称。 三、基础知识 1. 访问变量比访问一个类的字段要快/ 2. 同时判断数组为空一般不用getCount()==0这样的方法,直接通过isEmpty()这样的方法来处理 3. 很多情况下慎用全局的静态类。 4. Android应用执行起来很多的CPU占用都是出在JVM资源是放上,所以如果尽可能的减少内存的释放,或增加手机的RAM对程序的执行效率会很有帮助。 5. 尽量少的注册系统广播通知接收,同时适当的可以通过重写onPause或onResume来控制Activity显示时才获取部分系统广播。
NDK版本与Android固件要求对应表 Android开发技术
对于Android NDK版本来说,编译出来的so文件对应运行的Android固件最小版本是有一定要求的,高版本的NDK编译出的.so文件由于包含了一些新的特性,新特性可能在低版本的Android固件上无法运行,目前最新的对着表Android开发网总结如下 API Level 1 — Android 1.0 不支持NDKAPI Level 2 — Android 1.1 不支持NDKAPI Level 3 — Android 1.5 NDK 1API Level 4 — Android 1.6 NDK 2API Level 5 — Android 2.0 API Level 6 — Android 2.0.1 API Level 7 — Android 2.1 NDK 3 API Level 8 — Android 2.2 […]
Android标题栏进度指示器使用方法 Android开发技术
很多网友可能发现,比如Android自带的浏览器在载入网页时等待时间可能会在标题栏的右上角有一个小圆圈在不断旋转,由于其不包含具体进度,很多网友可能没有找到详细的操作方法在SDK中。作为标题栏进度指示器其实属于Activity类的方法。 在使用时我们首先需要在setContentView之前声明 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); ,在需要显示进度时调用 setProgressBarIndeterminateVisibility(true);即可,停止时调用 setProgressBarIndeterminateVisibility(false);
优化Dalvik虚拟机的堆内存分配 Android开发技术
对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
Android中的正则表达式Regex使用 Android开发技术
对于数据的提取查找,我们推荐大家使用功能强大的正则表达式,在Android平台中可以方便的使用Java VM中自带的Regex正则表达式库,实际测试性能比STL和Boost的差不了多少,当然了Android上的正则库是NDK编写的底层。 这里我们就拿常用的电话号码匹配来做个例子,大家都知道国外的号码中间有几个横杠,这里我们就用国内的区号来测试吧。 String phoneArray = "cwj 的号码:021-12345\n" + "smart 的号码:021-88888\n"+ "李雷 的号码:010-99999\n" + "韩美美 的号码:021-66666\n"; 如果我们需要匹配以021开头的正则表达式为 .*021-\\d{5} ,我们使用Java的Pattern类编译封装,使用matcher来查找,其中group方法就是结果,当然group(0)是找的自己串,同时可能有多个结果,注意数组下溢问题。 Pattern pattern = Pattern.compile(".*021-\\d{5}"); Matcher matcher = pattern.matcher(phones1); while(matcher.find()) { String s= matcher.group() ; Log.e(s,"android123.com.cn"); // 使用Android的Logcat查看运行结果,直接使用e标志红色的为结果。 } 正则表达式相对强大,如果过去做过Web开发的你,对于用户输入的过滤可能相当的熟悉。具体的正则式编写可以查看网上的相关内容。
InputSream输入流转String字符串,Android开发工具类 Android开发技术
在Android平台上使用Java层处理I/O时主要使用流,这里Android开发网给大家一个方便的类,可以处理InputStream输入流转为String字符串,在效率上,我们使用了字符串拼接StringBuilder类减少内存碎片以及BefferedReader类实现一个缓存。 private String Stream2String(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is), 16*1024); //强制缓存大小为16KB,一般Java类默认为8KB StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { //处理换行符 sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch […]
TextUtils类-Android字符串处理类 Android开发技术
对于字符串处理Android为我们提供了一个简单实用的TextUtils类,如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类,主要的功能如下: 是否为空字符 static boolean isEmpty(CharSequence str) 拆分字符串 public static String[] split (String text, String expression) ,Android开发网提示大家仔细看例子如下 String.split() returns [”] when the string to be split is empty. This returns []. This does not remove any empty strings from the result. For example split("a,", "," ) returns {"a", ""}. 拆分字符串使用正则 public static String[] split […]
Android堆内存也可自己定义大小 Android开发技术
对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了上次Android开发网提到的 优化Dalvik虚拟机的堆内存分配 外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例: private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。
Android Button按钮控件美化方法 Android开发技术
对于Android自带的Button按钮控件很多网友感觉不是很美观,如果界面上按钮不多,我们可以通过一种简单的方法实现Button脱胎换骨的外观,考虑到效率Android的layout方式的xml文件先不用了,毕竟控件不多模拟一个个性化Button还是很简单的,我们直接通过图片实现颜色的,代码如下: private Button mBtn; //定义我们的按钮 在onCreate中加入 mBtn = (Button) findViewById(R.id.btn); //btn为layout中的Button ID mBtn.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0,MotionEvent arg1) { if(arg1.getAction() == MotionEvent.ACTION_DOWN) { arg0.setBackgroundResource(R.drawable.pressed); //按下的图片对应pressed } else if(arg1.getAction() == MotionEvent.ACTION_UP) { arg0.setBackgroundResource(R.drawable.normal); //常态下的图片对应normal } else if() […]

让你的Android程序兼容多种分辨率 Android开发技术
随着Android机型的不断增多,从默认HVGA 320×480 到 WVGA 480×800 、FWVGA 480×854 以及QVGA的240×320,如果要保证这些机型的正常显示,可能涉及到图片资源单独设计,虽然有朋友考虑使用9patch方法可以解决拉伸,但是我们要考虑如果一个主程序的背景图片,可能原来为480×800的Nexus One上正常运行,但是到了HTC Tattoo的240×320,可以想想是什么样子。Android开发网提示大家对于Android 2.0而言资源要单独考虑,不然无法正常被加载。如下图很多都加了v6的字样。 我们将对上面的文件夹命名方式做详细的解释: drawable-hdpi 这个hdpi代表high dpi,一般为 WVGA或 FWVGA分辨率的图片,如480×800,而mdpi 代表 mid dpi,一般为HVGA,如320×480。而 ldpi为 low dpi,一般为QVGA,如240×320。而下面layout中的land代表横屏时的布局。但是有些网友可能发现了 -v6的字样android123提示这是 Android 2.0开始出现一些bug的解决方法。 -v6是专门为2.0固件的机型设计的。 v6代表 API Level 6
判断Android文件名是否安全技巧 Android开发技术
有时候我们在处理用户输入的文件名时需要多加小心,对于Android文件名来说可以使用Java自带的正则表达式库轻松判断,Android123给出大家两种重载方式以方便不同的场合。这两个方法可以直接静态调用,传入完整路径或文件名均可。 public static boolean IsFileNameOK(String filepath) { return Pattern.compile("[\\w%+,./=_-]+").matcher(filepath).matches(); } public static boolean IsFileNameOK(File file) { return Pattern.compile("[\\w%+,./=_-]+").matcher(file.getPath()).matches(); }
Android高性能文件类MemoryFile Android开发技术
很多网友抱怨Android处理底层I/O性能不是很理想,如果不想使用NDK则可以通过MemoryFile类实现高性能的文件读写操作。MemoryFile顾名思义就是内存文件的意思,如果你过去从事过Win32开发,那么它的原理就是MapViewOfFile(),当然开发过Linux的网友可能很快就联想到了mmap(),是的该类就是他们的托管代码层封装,位于android.os.MemoryFile这个位置,从Android 1.0开始就被支持。 MemoryFile适用于哪些地方呢? 对于I/O需要频繁操作的,主要是和外部存储相关的I/O操作,MemoryFile通过将 NAND或SD卡上的文件,分段映射到内存中进行修改处理,这样就用高速的RAM代替了ROM或SD卡,性能自然提高不少,对于Android手机而言同时还减少了电量消耗。Android123提示网友该类实现的功能不是很多,直接从Object上继承,通过JNI的方式直接在C底层执行。 主要的构造方法 MemoryFile(String name, int length) ,这里第二个参数为文件大小,需要说明的是Android的MemoryFile和传统的mmap还有一点点区别,毕竟是手机,它内部的内存管理方式ashmem会从内核中回收资源。毕竟目前部分低端机型的RAM也比较吃紧。 synchronized boolean allowPurging(boolean allowPurging) //允许ashmem清理内存,线程安全同步的方式。 void close() //关闭,因为在Linux内部mmap占用一个句柄,不用时一定要释放了 InputStream getInputStream() 返回读取的内容用Java层的InputStream保存 OutputStream getOutputStream() 把一个OutputSream写入到MemoryFile中 boolean isPurgingAllowed() //判断是否允许清理 int length() //返回内存映射文件大小 下面就是我们熟悉的,读写细节,主要是对字符数组的操作,这里大家要计算好每个文件类型的占用,同时考虑到效率对于自己分配的大小考虑粒度对齐。 int readBytes(byte[] buffer, int srcOffset, int destOffset, int count) void writeBytes(byte[] buffer, int srcOffset, int destOffset, int count) 具体的实际应用,Android开发网将在下次和大家讲到。
JSONObject在Android上的应用 Android开发技术
如果你过去开发过AJAX应用,相信对JSONObject不会陌生吧,作为基于JavaScript的数据交换格式,可以直接代替Xml,这里Android从1.0开始就完全支持JSONObject。在平时应用中直接引入import org.json.JSONObject;即可方便使用。当然同类的还有SOAP。 在常规使用方便JSONObject对象可以实现类似Bundle或Parcel可以封装数据,代替一个XML的ITEM,但最大的优势是可以执行一些简单的方法,比如说getString、has、put、getBoolean、getInt等数据类型的存取操作。Android123提示大家对于常规的项目开发,今天本文不考虑Server端的布局,在Android平台上处理这些比较简单,主要是一些http的请求处理。可以直接引入import org.apache.http.xxx来实现web server层的数据交换,如果你没有专业的Server开发技术,可以通过简单的Web配合JSON方式快速实现自己的交互式应用。
Android的Activity你知多少呢? Android开发技术
看到这个标题很多网友肯定回答,我知道Activity是Android上的窗口基类,了解Activity的生命周期比如onCreate onStop等,呵呵,按照这样说Android123还知道Activity的实现其实是从ApplicationContext,而ApplicationContext是从Context这个抽象类派生而来的,当然我们看到显示的是View或者ViewGroup,当然今天说的不是这些东西,而是很多网友来问的Android为什么不设计一个任务管理器,当然从Android 1.5开始ActivityManager类提供了restartPackage可以关闭一个程序,需要加上<uses-permission android:name="android.permission.RESTART_PACKAGES"/>这个权限,不过我们注意到,长按Home键可以看到以前程序的运行,同时可以快速的切换回来。这就是Android独有的程序生命周期管理机制 Activity历史栈。 我们在一个普通的程序主窗口A中打开了一个窗口B,而窗口B打开了窗口C,但是按下Back键后结果出乎了预期,是的这就是Activity的history stack的原因,在数据结构中栈是FIFO的,阻止我们不愿意看的情况的发生则可以在打开新Activity时加上标记FLAG_ACTIVITY_NO_HISTORY,代码如下: Intent i= new Intent(this, cwj.class); i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); //Android开发网提示大家相关的还有Intent.FLAG_ACTIVITY_CLEAR_TOP,都试试 startActivity(i); 当然更多的程序Activity控制可以再androidmanifest.xml中定义。
Android游戏开发性能改进要点 Android开发技术
目前来说Android平台在整体性能上表现不错,大多数调用都是Dalvik API通过JNI到底层了,但是在游戏性能方面和iPhone的Objective-C有着较大的差距,最新发现有如下的改进: 1. 首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配 2. 基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。Android123提示游戏开发者,这点比较有意思的是Google推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的。 3. 图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap可以使用下面的方式,如 if(bitmapObject.isRecycled()==false) //如果没有回收 bitmapObject.recycle(); 4. 目前系统对动画支持比较弱智对于常规应用的补间过渡效果可以,但是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,目前Android系统仅能预览GIF的第一帧,可以借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。 5. 对于大多数Android手机没有过多的物理按键可能我们需要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。
Splash Screen开场屏在Android中的实现 Android开发技术
很多网友可能发现近期Tencent推出的手机QQ Android版包含了一个开场屏Splash Screen载入效果,通常游戏或大型软件打开时可能需要一个释放解析资源的过程,需要一个前台的动画播放和后台的逻辑处理线程配合,当然对于简单的软件也可以加一个Splash Screen作为美化。在Android平台上如何实现呢? 首先创建一个Activirty,在SetContentView时直接通过ImageView创建一个全屏的图片,Android123提示大家还要考虑好分辨率和当前设备一致,onCreate添加代码如下: new Handler().postDelayed(new Runnable(){ // 为了减少代码使用匿名Handler创建一个延时的调用 public void run() { Intent i = new Intent(SplashScreen.this, Main.class); //通过Intent打开最终真正的主界面Main这个Activity SplashScreen.this.startActivity(i); //启动Main界面 SplashScreen.this.finish(); //关闭自己这个开场屏 } }, 5000); //5秒,够用了吧
不会Java或C,Android123告诉你还有选择 Android开发技术
随着Google Android平台的逐渐开放,很多过去并不是开发Java或C的网友也想涉及,今天Android123高速你新的开发方法。今天抛开Dalvik VM的Java和NDK的C/C++,那么还有什么方法来实现自己的软件呢? 1. Flash Action Script ,对于学过Flash脚本的网友未来可以尝试通过Adobe Open Screen方法通过Flash实现界面UI,可能对于游戏开发来说是一项迈进,从Android 2.1到以后基本上都会支持Flash播放插件。 2. JavaScript+HTML+CSS,这个可能是W3C的Widget开发方式,Web程序员可以简单的通过Html+CSS实现布局,通过JavaScript实现逻辑,或者AJAX方式实现网络访问等等,软件从webkit浏览器直接加载运行。 3. Web网页游戏,现在很多浏览器都可以打网游,这归功于Adobe Flash Player强大的标示和逻辑处理能力,这样的好处显而易见就是块平台方便,用户可以在PC上娱乐,如果网速足够理想在地铁上也可以使用 Android手机浏览器来打网游,怎么样其实想想还是有很多种选择的。
GestureDetector手势识别类 – 入门篇 Android开发技术
对于Android设备来说最主要的操作方式为触控,作为一个Android开发者来说深入了解 GestureDetector 手势识别是很有必要的,Android123今天主要介绍下该类相关的方法,以及简单的手势识别。 通常我们构造GestureDetector类时设置一个GestureDetector.OnGestureListener对象来实时监控用户的操作,OnGestureListener对象提供一些常见手势的重写方法。 @Override public boolean onDown(MotionEvent e) { //按下事件 return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //快速滚动 return true; } @Override public void onLongPress(MotionEvent e) { //长按 } @Override public […]
Android平台XML解析库功能不完整 Android开发技术
很多网友可能发现Android平台上XML解析库包含了主流的Dom、SAX以及XmlPull方式,如果为了跨平台数据库保存可能不使用SQLite的话,可能XML实现最好,但是可笑的事情发生了。Android上面解析库不可以保存解析结果,这点比J2ME的KXml还简陋,真不知道Google这帮家伙如何搞的。 Android123提示大家,对于简单的XML文件创建可以使用XmlSerializer,而常规不做XML解析即Parser的话,还是使用Dom来操作每个元素,这里面我们不考虑XPath实现查找的复杂应用,但是Dom竟然无法返回整个树的字符串结果相当意外也没有transformer或输出流的相关方法,这点可以看到就不存在javax.xml.transform.的实现。目前没有很好的解决方法,如果不考虑引入第三方的完整的xml解析库jar文件。可以考虑移植一个高效轻量级的xml解析库用NDK比较有效。
获取Android屏幕方向及键盘状态 Android开发技术
很多开发Android的网友可能需要判断当前的屏幕方向或键盘状态,下面的代码可以判断出横屏landscape和常规的portrait纵握方式,如果使用的是G1这样有QWERTY键盘硬件的,还可以判断屏幕方向以及键盘的拉出状态。 Configuration config = getResources().getConfiguration(); if (config.orientation == Configuration.ORIENTATION_LANDSCAPE){ //横屏,比如 480×320 }else if(config.orientation == Configuration.ORIENTATION_PORTRAIT){ //竖屏 ,标准模式 320×480 }else if(config.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_NO){ //横屏,Android123提示物理键盘滑出了 }else if(config.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_YES){ //竖屏,键盘隐藏了 }
自定义Android标题栏TitleBar布局 Android开发技术
很多网友发现自己Android程序的标题栏TitleBar区域很单调,如果想个性化一些可以通过下面的方法来为自己软件的标题定制一个layout布局文件,比如浏览器的标题栏,它包含了网站的Favicon,自定义的进度条,和不确定的进度指示等等,实现的方法自己控制吧。下面代码在onCreate中使用,同时顺序不要改变,Android123提示各位开发者否则将无法生效: requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //软件activity的布局 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar为自己标题栏的布局
测试Android软件性能主要方法 Android开发技术
对于Android平台上软件的性能测试可以通过以下几种方法来分析效率瓶颈,目前Google在Android软件开发过程中已经引入了多种测试工具包,比如Unit测试工程,调试类,还有模拟器的Dev Tools都可以直接反应执行性能。 1. 在模拟器上的Dev Tools可以激活屏幕显示当前的FPS,CPU使用率,可以帮助我们测试一些3D图形界面的性能。 2. 一般涉及到网络应用的程序,在效率上和网速有很多关系,这里需要多次的调试才能实际了解。 3. 对于逻辑算法的效率执行,我们使用Android上最普遍的,计算执行时间来查看: long start = System.currentTimeMillis(); //android开发网提示这里做实际的处理do something long duration = System.currentTimeMillis() – start; 最终duration保存着实际处理该方法需要的毫秒数。这里类似Win32上的GetTickCount,在Win 32和Symbian上都提供了高精度的性能计数器和低阶计时器,这里在Dalvik VM上的Java层这种方法对于一般的应用足以。 4. GC效率跟踪,如果你执行的应用比较简单,可以在DDMS中查看下Logcat的VM释放内存情况,大概模拟下那些地方可以缓存数据或改进算法的。 5. 线程的使用和同步,Android平台上给我们提供了丰富的多任务同步方法,但在深层上并没有过多的比如自旋锁等高级应用,不过对于Service和appWidget而言,他们实际的产品中都应该以多线程的方式处理,以释放CPU时间,对于线程和堆内存的查看这些都可以在DDMS中看到。 更多的调试和性能测试方法Android123将在以后的内容中出现。
Android全屏设置代码 Android开发技术
如果你在开发游戏或一个主题风格很特别的应用可能需要全屏显示,在Android中全屏窗口的代码很简单,主要分为两个步骤和一个注意点: requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏 不过Android123提醒各位开发者注意的是这些调用要放在SetContentView前面,否则无法生效或结果有出入。
Android布局Java代码构造法 Android开发技术
一般情况下对于Android程序布局我们往往使用XML文件来编写,这样可以提高开发效率,但是考虑到代码的安全性以及执行效率,可以通过Java代码执行创建,虽然Android编译过的xml是二进制的,但是加载xml解析器的效率对于资源占用还是比较大的,一般一个简单的TextView,比如 <TextView android:id="@+id/textControl " android:layout_width="100px" android:layout_height="wrap_content" /> 可以等价于下面的Java代码: LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT); //宽度为100px,高为自适应最小的高度 // setOrientation(VERTICAL); 设置布局为垂直 TextView textControl = new TextView(this);//如果从一个XXXLayout.,比如LinearLayout为View的基类时这里this应该换成为创建改类的Context textControl.setText("Android开发网欢迎您"); addView( textControl, textParams ); 当然Java处理效率比XML快得多,但是对于一个复杂界面的编写,可能需要一些套嵌考虑,如果你思维灵活的话,使用Java代码来布局你的Android应用程序是一个更好的方法。
EditText输入提示你知道吗? Android开发技术
对于EditText控件来说可能需要用户输入提示,Android123给大家一个不错的方法,比如这个文本库是需要输入姓名的,可能 输入提示的内容为 “单击输入姓名”,使用Java代码,直接调用setHint(CharSequence hint) 即可,而对于layout xml布局文件而言,可以加入android:hint="单击输入姓名" 这行在你的 EditText 中即可。 Android开发网提示: 输入提示颜色为灰色的,用户单击后自动清除,一般作用是告诉用户这个文本框需要输入的内容是什么。
MenuInflater Android菜单从xml创建方法 Android开发技术
对于Android开发我们可以做的尽量MVC化,UI界面和Code逻辑代码分离方式,除了常规的Activity布局可以用xml实现外,菜单Menu也可以通过MenuInflater来映射一个布局文件,相关的创建菜单方法有些不同,如图: @Override protected void onCreateContextMenu(ContextMenu menu) { MenuInflater inflater = cwj.getMenuInflater(); //这里cwj为当前的context inflater.inflate(R.menu.android123, menu); //使用android123.xml文件作为菜单布局 } 接下来,我们创建相应的文件,路径为 /res/menu/android123.xml 具体内容如下,注意Item3可以禁用某项,同时加入相关的图片以及快捷键大家可以参考SDK实现更完整的方法。 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item1_id" android:title="@string/text1"/> <item android:id="@+id/item2_id" android:title="@string/text2"/> <item android:id="@+id/item3_id" android:title="@string/text3" android:enabled="false" /> </menu> 本文可以帮助我们深入的定制一些界面,相关的TitleBar自定义可以参考 自定义Android标题栏TitleBar布局
GestureDetector手势识别类 – 进阶篇 Android开发技术
上次我们提供了一个基本的框架可以实现Android平台上的手势操作,借助GestureDetector类可以轻松实现,详细查看 GestureDetector手势识别类 – 入门篇 本次结合网友总结的内容一起来探讨下具体的应用。 首先上次Android123写的较为简单,如果网友不太明白可以看看更具体些的内容: boolean onDoubleTap(MotionEvent e)解释:双击的第二下Touch down时触发boolean onDoubleTapEvent(MotionEvent e)解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。boolean onDown(MotionEvent e)解释:Touch down时触发boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)解释:Touch了滑动一点距离后,up时触发。void onLongPress(MotionEvent e)解释:Touch了不移动一直Touch down时触发boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)解释:Touch了滑动时触发。void onShowPress(MotionEvent e)解释:Touch了还没有滑动时触发(与onDown,onLongPress比较onDown只要Touch down一定立刻触发。而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。 boolean onSingleTapConfirmed(MotionEvent e)boolean onSingleTapUp(MotionEvent e)解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。 点击一下非常快的(不滑动)Touchup:onDown->onSingleTapUp->onSingleTapConfirmed 点击一下稍微慢点的(不滑动)Touchup:onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed 有了这么多的响应方式,我们能更加方便的对用户的触摸操作进行响应,对各种动作都有所对应。那么这个类如何使用呢,其实非常简单,在view的新建一个GestureDetector的对象。构造函数里gestureDetector = new GestureDetector(new SelfGestureDetectorListener()); 然后在View的onTouchEvent里以下这样用,就可以在gestureDetector的事件里写自己的代码了。@Overridepublic boolean […]
Android平台受专利影响 Android开发技术
目前Android平台部分东西受微软专利影响,导致HTC每出一部Google手机将会付出20~40美元不等的专利费用,价格问题主要是涉及专利数量的多少决定。不过我们看到Android在开源方面有很多东西可以利用到,同时对于各个厂商的支持都比较好,比如Adobe Flash的兼容,不过我们更期待PDF Reader也应该加入进去更好些。 微软目前持有专利可能是比较稳固的,但是IBM和Apple的创新能力确实提高了不少,而Google在非IT行业的投入也是相当大的,目前来看软件巨人开始玩专利游戏了,当然大多数Linux侵犯Windows专利。 Android手机目前售价相对较高主要原因在于研发成本上,目前Motorola的设备在硬件方面成本不是很高,但是人力方面可谓是下足功夫,Moto的Blur界面看上去不像是Android,但是Motorola已经不是北美最大的手机制造商了,这一位置逐渐被iPhone代替,同时Motorola财报智能手机终端部门仍然亏损状态。
Android的ListView控件滚动时背景问题 Android开发技术
如果大家在非黑色背景下使用ListView控件时,Android默认可能在滚动ListView时这个列表控件的背景突然变成黑色。这样可能导致程序的黑色的背景和主程序的主题既不协调。解决的方法Google在设计Android时也考虑了,在Layout的ListView中加入android:cacheColorHint="#00000000" 的属性即可。
Android开发需要自己完善的类库总结 Android开发技术
经历了目前最新的Android 2.1包括2.2透露出的特性来看,目前Android开发在实际项目中仍然存在很多问题。这里我们主要列举下开源中有哪些主要问题: 1. xml解析,虽然Android自带了XmlPull、Dom、SAX解析器,但是对于XML修改后的保存来看仍然不够完善,当做解析器获取数据可以,如果作为数据双向交换,考虑到自己实现来看,可以考虑JSON解决或挂载Dom4j库。 2. zip处理,对于压缩文件处理,Android平台底层支持zlib库,但是可以看到底层写死仅支持utf8编码的文件名,如果文件名是日文或中文如果自己不重新编译zlib底层,还是考虑使用apache ant库提供的方法,当然对于zip密码而言仍然不被支持。 3. gif动画,目前我们可能会发现很多手机不支持Gif动画的播放,仅仅显示开头一帧,当然GIF的原理就是开一个线程轮询播放每一帧,可能考虑到平台的性能或电池功耗,在CPU没有到1.5GHz时代时可能不会被加入吧。这可能也是直到Android 2.2才加入Flash的原因。 当然还有很多底层库都存在对宽字节和编码问题,而大多数对于标准的处理仅仅兼容utf8这样的,对于unicode的兼容度不够,可能造成部分地方为乱码,比如早期Android平台对于短信无法发送中文这样的BUG。
Android上HTTP协议通讯状态获取 Android开发技术
通常情况下轻量级的Http传输Android平台可以直接使用Sun Java的HttpURLConnection类方法处理,比如果自己定义一次请求header可以通过setRequestProperty设置,而我们需要获取的Http Web Server状态可以通过HttpURLConnection.getResponseCode() 的方法获取。 当然Http协议返回值常见的有 200 为成功,400为请求错误,404为未找到,500为服务器内部错误,403无权查看,302为重定向等等。 对于Android平台提供更完善的Apache类有HttpClient 、HttpPost、HttpResponse、HttpGet和HttpEntity,其中对于数据报头header构造通过HttpEntity,而返回状态值可以通过HttpResponse获取。 有关Android客户端和Server通讯类相关的开发我们将会在以后文章中做大量实例介绍。


