2012年10月10日
原文作者: xu33liang33 原文地址: http://my.eoe.cn/xuliangbo/archive/4271.html
参考:http://developer.android.com/distribute/googleplay/promote/linking.html
1 Intent intent = new Intent(Intent.ACTION_VIEW); 2 intent.setData(Uri.parse("market://details?id=com.example.android")); 3 startActivity(intent);
摘要: 第四篇:http://blog.csdn.net/mapdigit/article/details/7570371
App->Activity->Custom Dialog
这个Demo主要是实现自定义对话框。先通过Android Manifest.xml文件找到CustomDialogActivity:
Code highlighting produced by ... 阅读全文
摘要: 第三篇:http://blog.csdn.net/mapdigit/article/details/7555429App->Activity->Animation这个Demo主要讲的是两个Activity在跳转过程中的动画应用。通过Android Manifest.xml文件找到com.example.android.apis.app包下的 Animation类:
Code high... 阅读全文
摘要: 第二篇:http://blog.csdn.net/mapdigit/article/details/7555404创建好ApiDemos项目以后,首先在模拟器上运行该程序,可以看到主界面是一个列表。单击列表中一个栏目后还有若干级列表,最终是一个Activity,展示了其API的一个特性。API Demos全面展示了系统的功能,包括界面、控件、图像处理和媒体处理等。
然后逐个来分析代码:
首先我... 阅读全文
右键D:\Program Files (x86)\Android\android-sdk\SDK Manager.exe->以管理员身份运行。
第一篇:http://blog.csdn.net/mapdigit/article/details/7555392
在csdn上看到了这位大神写的博客,自己也试着学习一下,以前一直都想学习api demos,但是找了很多借口。
Android SDK中自带有很多例子,存放在android-sdksamples目录下,其中介绍了Android平台主要的API的使用,是一份不可多得的学习资料!以Android4.1.2为例,apis目录如下:
首先尝试将ApiDemos源码导入到Eclipse项目中,这个比较简单, 1.New ->Other 选择Android Sample Project (注:不同版本的Eclipse有不同的导入方法,不同Android版本有对应的ApiDemos示例) 。 选择版本,这里我选择4.1.2:
最后直接finish就可以了。
下面看看工程 运行工程可以查看效果图 :
本来一天一帖的,没想到昨天竟然断网了,又本来今天发两贴的,结果学完了但是没写完,效率太低了,现在发现写博客也不是一件很容易的事情,以后每天坚持。
摘要: 现在的大多数应用都会有一个欢迎引导页面,需求分析:程序安装后第一次启动:启动页-->功能引导页-->应用主页以后启动:启动页-->应用主页
实现原理:
用SharedPreferences实现。创建一个boolean的变量,默认值为true。当判断这个变量是true的时候,说明是第一次运行,就跳转到另一个引导页面。引导页面跳转到最后一张图片时,点击某按钮发生跳转事件,回到M... 阅读全文
摘要: 这个小程序的主要原理是通过HTTP协议发送XML数据并调用webservice,分析返回的数据来进行Android查询QQ是否在线。Web Service(WEB服务)能够快捷和方便地综合并结合各种系统、商务和任何应用平台。新出现的 Web Services 标准: SOAP、WSDL 和 UDDI 能够使任何系统和系... 阅读全文
摘要: eoe在线课堂传送门: http://edu.eoe.cn/course/view/cid/25.html资料下载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=238145&page=1&extra=#pid21590241、二维码介绍:二维码 (2-dimensional bar code),是用... 阅读全文
ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,在需要的时候再加载View,可Java中常见的性能优化方法延迟加载一样。
当调用ViewStub的setVisibility函数设置为可见或则调用 inflate初始化该View的时候,ViewStub引用的资源开始初始化,然后引用的资源替代ViewStub自己的位置填充在ViewStub的 位置。因此在没有调用setVisibility(int) 或则 inflate()函数之前 ViewStub一种存在组件树层级结构中,但是由于ViewStub非常轻量级,这对性能影响非常小。 可以通过ViewStub的inflatedId属性来重新定义引用的layout id。 例如:
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
上面定义的ViewStub ,可以通过id “stub”来找到,在初始化资源“mySubTree”后,stub从父组件中删除,然后"mySubTree"替代stub的位置。初始资源"mySubTree"得到的组件可以通过inflatedId 指定的id "subTree"引用。 然后初始化后的资源被填充到一个120dip宽、40dip高的地方。
ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate(); 当调用inflate()函数的时候,ViewStub 被引用的资源替代,并且返回引用的view。 这样程序可以直接得到引用的view而不用再次调用函数 findViewById()来查找了。 activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" >
<!-- 静态加载布局文件 -->
<include android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/my_sub_tree" />
<!-- 动态加载布局文件 -->
<ViewStub android:id="@+id/stub" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inflatedId="@+id/subTree" android:layout="@layout/my_sub_tree" />
<Button android:id="@+id/button_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态加载布局" />
<Button android:id="@+id/button_hidden" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态隐藏布局" />
</LinearLayout> my_sub_tree.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<RatingBar android:id="@+id/ratingBar" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout> MainActivity.java: package com.example.android_viewstub;
import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewStub; import android.widget.Button; import android.widget.RatingBar;
/** * Demo描述: 利用ViewStub显示和隐藏布局 ViewStub的引入: 在开发的时候,有些布局是要根据条件而动态显示,达到一个布局两用的效果, * 运用View.VISIBLE和View.GONE去改变布局的可见性. 这样的做法显然是没什么多大的问题,优点逻辑清晰,控制灵活,但缺点就是耗费资源 * 在setContentView()或者用inflate加载布局文件时无论View是否 * 被设置为View.GONE和View.VISIBLE,都会创建对象,占用一定程度上的内存,所以在考虑优化程序的时候, * 尽量避免资源浪费,降低程序的资源占有量,提高响应速度,提升软件的用户体验 * * 推荐的做法是使用android.view.ViewStub. ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件. * ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件当 ViewStub可见,或者调用 * inflate()函数时,才会加载这个布局资源文件 注意的问题: ViewStub只能用来Inflate一个布局文件,而不是某个具体的View * * 遇到的问题: 报错 ViewStub must have a non-null ViewGroup viewParent 原因: * 官方文档:viewstub不能反复inflate,只能inflate一次 * */ public class MainActivity extends Activity implements OnClickListener { private ViewStub mViewStub; private Button mShowButton; private Button mHiddenButton;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); bindView(); }
private void findView() { mViewStub = (ViewStub) this.findViewById(R.id.stub); mShowButton = (Button) this.findViewById(R.id.button_show); mHiddenButton = (Button) this.findViewById(R.id.button_hidden); }
private void bindView() { mShowButton.setOnClickListener(this); mHiddenButton.setOnClickListener(this); }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
@Override public void onClick(View v) { switch (v.getId()) { case R.id.button_show: View inflated = mViewStub.inflate(); RatingBar ratingBar = (RatingBar) inflated .findViewById(R.id.ratingBar); ratingBar.setRating(4); // mViewStub.setVisibility(View.VISIBLE); break; case R.id.button_hidden: mViewStub.setVisibility(View.GONE); break; default: break; } }
}
当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入。 1 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 2 //得到InputMethodManager的实例 3 if (imm.isActive()) { 4 //如果开启 5 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS); 6 //关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的 7 }
也可以简单点:1 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); xml方式:1 <activity android:name=".Activity.FilterActivity" android:label="@string/app_name" android:windowSoftInputMode="stateHidden" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" 2 /> 下面做个详细的介绍: 软输入法模式选项: public int softInputMode;
以下选项与输入法模式有关: 软输入区域是否可见。 public static final int SOFT_INPUT_MASK_STATE = 0x0f;
未指定状态。 public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;
不要修改软输入法区域的状态。 public static final int SOFT_INPUT_STATE_UNCHANGED = 1;
隐藏输入法区域(当用户进入窗口时)。 public static final int SOFT_INPUT_STATE_HIDDEN = 2;
当窗口获得焦点时,隐藏输入法区域。 public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3;
显示输入法区域(当用户进入窗口时)。 public static final int SOFT_INPUT_STATE_VISIBLE = 4;
当窗口获得焦点时,显示输入法区域。 public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5;
窗口应当主动调整,以适应软输入窗口。 public static final int SOFT_INPUT_MASK_ADJUST = 0xf0;
未指定状态,系统将根据窗口内容尝试选择一个输入法样式。 public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00;
当输入法显示时,允许窗口重新计算尺寸,使内容不被输入法所覆盖。 不可与SOFT_INPUT_ADJUSP_PAN混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。 public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;
输入法显示时平移窗口。它不需要处理尺寸变化,框架能够移动窗口以确保输入焦点可见。 不可与SOFT_INPUT_ADJUST_RESIZE混合使用;如果两个都没有设置,系统将根据窗口内容自动设置一个选项。 public static final int SOFT_INPUT_ADJUST_PAN = 0x20;
当用户转至此窗口时,由系统自动设置,所以你不要设置它。 当窗口显示之后该标志自动清除。 public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;
用eclipse进行android开发中经常遇到logcat无任何信息输出,这给我们调试程序带来很大的不便。解决办 法:window-->show view-->选择android下的devices,打开devices,点击右边的截屏图片。等到出现截图的时候,logcat就出来信息了!
PS:如果以上方法试过之后logcat还没有任何信息,则把logcat窗口关了,重新打开
设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素。
文件(Files)注释标签:
/**
* @Title: ${file_name}
* @Package ${package_name}
* @Description: ${todo}(用一句话描述该文件做什么)
* @author A18ccms A18ccms_gmail_com
* @date ${date} ${time}
* @version V1.0
*/
类型(Types)注释标签(类的注释):
/**
* @ClassName: ${type_name}
* @Description: ${todo}(这里用一句话描述这个类的作用)
* @author A18ccms a18ccms_gmail_com
* @date ${date} ${time}
*
* ${tags}
*/
字段(Fields)注释标签:
/**
* @Fields ${field} : ${todo}(用一句话描述这个变量表示什么)
*/
构造函数标签:
/**
* <p>Title: </p>
* <p>Description: </p>
* ${tags}
*/
方法(Constructor & Methods)标签:
/**
* @Title: ${enclosing_method}
* @Description: ${todo}(这里用一句话描述这个方法的作用)
* @param ${tags} 设定文件
* @return ${return_type} 返回类型
* @throws
*/
覆盖方法(Overriding Methods)标签:
/* (非 Javadoc)
* <p>Title: ${enclosing_method}</p>
* <p>Description: </p>
* ${tags}
* ${see_to_overridden}
*/
代表方法(Delegate Methods)标签:
/**
* ${tags}
* ${see_to_target}
*/
getter方法标签: /** * @return ${bare_field_name} */
setter方法标签: /** * @param ${param} 要设置的 ${bare_field_name} */
简单模板例子: 1 <?xml version="1.0" encoding="UTF-8"?><templates><template autoinsert="true" context="fieldcomment_context" deleted="false" description="字段的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/** 2 * @Fields ${field} : ${todo}(用一句话描述这个变量表示什么) 3 */ 4 </template><template autoinsert="true" context="gettercomment_context" deleted="false" description="getter 方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/** 5 * @return ${bare_field_name} 6 */ 7 </template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="创建的构造函数的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/** 8 * <p>Title:${file_name} </p> 9 * <p>Description: 构造函数</p> 10 * ${tags} 11 */ 12 </template><template autoinsert="true" context="filecomment_context" deleted="false" description="已创建的 Java 文件的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment">/** 13 * @Title: ${file_name} 14 * @Package ${package_name} 15 * @Description: ${todo}(用一句话描述该文件做什么) 16 * @author DAIGUANGJIU 17 * @date ${date} ${time} 18 * @version V1.0 19 */ 20 </template><template autoinsert="true" context="settercomment_context" deleted="false" description="setter 方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/** 21 * @param ${param} 要设置的 ${bare_field_name} 22 */</template><template autoinsert="true" context="typecomment_context" deleted="false" description="创建的类型的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/** 23 * @author ${user} 24 * 25 * ${tags} 26 */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="代表方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/** 27 * ${tags} 28 * ${see_to_target} 29 */</template><template autoinsert="true" context="overridecomment_context" deleted="false" description="覆盖方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/** (非 Javadoc) 30 * <p>Title: ${enclosing_method}</p> 31 * <p>Description: </p> 32 * ${tags} 33 * ${see_to_overridden} 34 */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="非覆盖方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/** 35 * ${tags} 36 */</template></templa 37 <?xml version="1.0" encoding="UTF-8"?><templates><template autoinsert="true" context="fieldcomment_context" deleted="false" description="字段的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/** 38 * @Fields ${field} : ${todo}(用一句话描述这个变量表示什么) 39 */ 40 </template><template autoinsert="true" context="gettercomment_context" deleted="false" description="getter 方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/** 41 * @return ${bare_field_name} 42 */ 43 </template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="创建的构造函数的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/** 44 * <p>Title:${file_name} </p> 45 * <p>Description: 构造函数</p> 46 * ${tags} 47 */ 48 </template><template autoinsert="true" context="filecomment_context" deleted="false" description="已创建的 Java 文件的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment">/** 49 * @Title: ${file_name} 50 * @Package ${package_name} 51 * @Description: ${todo}(用一句话描述该文件做什么) 52 * @author DAIGUANGJIU 53 * @date ${date} ${time} 54 * @version V1.0 55 */ 56 </template><template autoinsert="true" context="settercomment_context" deleted="false" description="setter 方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/** 57 * @param ${param} 要设置的 ${bare_field_name} 58 */</template><template autoinsert="true" context="typecomment_context" deleted="false" description="创建的类型的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/** 59 * @author ${user} 60 * 61 * ${tags} 62 */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="代表方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/** 63 * ${tags} 64 * ${see_to_target} 65 */</template><template autoinsert="true" context="overridecomment_context" deleted="false" description="覆盖方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/** (非 Javadoc) 66 * <p>Title: ${enclosing_method}</p> 67 * <p>Description: </p> 68 * ${tags} 69 * ${see_to_overridden} 70 */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="非覆盖方法的注释" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/** 71 * ${tags} 72 */</template></template>
使用last_insert_rowid()函数,例如: 1 SQLiteDatabase db = helper.getWritableDatabase(); 2 db.execSQL("insert into person(name,phone,amount) values(?,?,?) ", 3 new Object[]{person.getName(),person.getPhone(),person.getAmount()}); 4 Cursor cursor = db.rawQuery("select last_insert_rowid() from person",null); 5 int strid; 6 if(cursor.moveToFirst()) 7 strid = cursor.getInt(0); 8 Log.i("testAuto", strid+"");
android程序中如果有很多activity,又没有在跳转过程中全都finish,很可能在最后退出程序时,当前的activity结束了,但是又 跳转到activity栈的下一个activity。例如从A-B-C,在跳转过程中没有finish掉B,那么从C退出程序时,就会跳到B的界面。
最理想的解决办法就是每次在调用startActivity(intent)之前finish当前的activity,但是如果在下一个activity 又要回到上一个activity,就需要new一个新的activity了。如果刚好这个activity需要加载很多图片和信息,例如一个 listactivity或者含有一个gallery,那么用户体验性就很差,每次按返回键都要重新加载。那么有没办法解决完全退出程序的方法,同时又能 保证用户体验性呢?
网上比较流行的方法是定义栈,写一个ExitApplication类,利用单例模式管理Activity,在每个在Activity的 onCreate()方法中调用ExitApplication.getInstance().addActivity(this)方法,在退出时调用 ExitApplication.getInstance().exit()方法,就可以完全退出应用程序了。 1 package com.gaolei.study; 2 3 import java.util.LinkedList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.app.Application; 8 9 public class MyApplication extends Application { 10 11 private static MyApplication instance; 12 13 private List<Activity> activityList = new LinkedList<Activity>(); 14 15 public MyApplication() { 16 } 17 18 // 单例模式获取唯一的MyApplication实例 19 public static MyApplication getInstance() { 20 if (null == instance) { 21 instance = new MyApplication(); 22 } 23 return instance; 24 } 25 26 // 添加Activity到容器中 27 public void addActivity(Activity activity) { 28 activityList.add(activity); 29 } 30 31 // 遍历所有Activity并finish 32 public void exit() { 33 for (Activity activity : activityList) { 34 activity.finish(); 35 } 36 System.exit(0); 37 } 38 } 39 每个Activity类中onCreate()方法中调用 ExitApplication.getInstance().addActivity(Activity activity)方法。在某一个Activity界面退出应用程序时,只要调用 ExitApplication.getInstance().exit()方法,就可以在完全退出应用程序。 当然也可以写一个BaseActivity继承Activity, 重写onCreate()方法,然后所有activity都继承它。
工具下载:需用到 dex2jar 和 XJad 这2个工具 该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。
步骤: 1.把.apk文件改名为.zip,然后解压缩,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件
2.把classes.dex拷贝到dex2jar.bat所在目录, 在命令行模式下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex ,生成classes.dex.dex2jar.jar
3.运行XJad工具(菜单栏 文件->反编译Jar文件),即可看到源代码 该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。
1. 在drawable 下新建 shape.xml 文件 Xml代码 : 1 <?xml version="1.0" encoding="UTF-8"?> 2 <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 android:shape="rectangle" > 4 5 <!-- 填充的颜色 --> 6 <solid android:color="#FFFFFF" /> 7 <!-- 设置矩形的四个角为弧形 --> 8 <!-- android:radius 弧形的半径 --> 9 <corners android:radius="7dip" /> 10 11 </shape> android:radius为角的弧度,值越大角越圆。 我们还可以把四个角设定成不同的角度,方法为: 1 <corners 2 android:bottomLeftRadius="20dp" 3 android:bottomRightRadius="0dp" 4 android:topLeftRadius="1dp" 5 android:topRightRadius="20dp" /> 2.1设置成0dp无效,2.1以上版本可以,如果无效的话那就只能设成1dp了。
2.设置引用
android:background="@drawable/shape" EditText 其它属性
android:hint="请输入用户名" <!-- 设置提示文本 --> android:drawableLeft="@drawable/ic_launcher" <!-- 设置文本框左边小图标 -->
例子:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <EditText 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:background="@drawable/shape" 11 android:drawableLeft="@drawable/ic_launcher" 12 android:drawablePadding="5dp" 13 android:hint="Hello Android" 14 android:padding="5dp" /> 15 16 </LinearLayout>
1. 取消系统的自动折叠 Window->Preferences-> Java->Editor->Folding: Enable folding
2. 取消按"."后自动激活提示功能。这样会有些提高速度 Window->Preferences-> Java->Editor->Content Assist: Enable auto activation
3. 关闭不常用的工程 一些不常用的工程打开的时候,也会影响你正在使用工程的操作速度。
4. 设置启动参数 起动的时候 加上参数:eclipse.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -Xms64M - Xmx200M 如果你的内存是1G的。可以将最后一个参数Xmx200M改为 Xmx512M 这个在你的起动快捷键的属性里设置。
6. 取消Plugin 进入Preferences把Plug-in Development>Target Platform> plug-in里跟自己无关或者暂且不用的plug -in去掉勾选,我这里共400多个中去掉了100多个。
7. 设置Edit Mode MyEclipse5.0.1GA_E3.2 之前的:Window->Preferences->-->myeclipse->files & Editors下把跟编辑有关的所有 的Edit Modes 设为 Disable Design Mode
8. 设置视图 打开Customize Perspective里自己没用到的选项自己去掉勾选。 5. 取消MyEclipse在启动时自动验证项目配置文件 默认情况下MyEclipse在启动的时候会自动验证每个项目的配置文件,这是 一个非常耗时的过程,可以在Preferences窗口依次选择MyEclipse - Validation,然后在右侧的Validator列表中只保留 Manual 项就可以了。如果需要验证的时候只需要选中文件,然后右键选择 MyEclipse - Run Validation就可以了。 9. 去除不需要加载的模块 一个系统20%的功能往往能够满足80%的需求,MyEclipse也不例外,我们在大多数时候只需要20%的 系统功能,所以可以将一些不使用的模块禁止加载启动。通过Windows - Preferences打开配置窗口,依次选择左侧的General - Startup and Shutdown,这个时候在右侧就显示出了Eclipse启动时加载的模块,可以根据自己的实际情况去除一些模块。
比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方法一: DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date d1 = df.parse("2004-03-26 13:31:40"); Date d2 = df.parse("2004-01-02 11:30:24"); long diff = d1.getTime() - d2.getTime(); long days = diff / (1000 * 60 * 60 * 24); } catch (Exception e) { } 方法二: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date now = df.parse("2004-03-26 13:31:40"); java.util.Date date=df.parse("2004-01-02 11:30:24"); long l=now.getTime()-date.getTime(); long day=l/(24*60*60*1000); long hour=(l/(60*60*1000)-day*24); long min=((l/(60*1000))-day*24*60-hour*60); long s=(l/1000-day*24*60*60-hour*60*60-min*60); System.out.println(""+day+"天"+hour+"小时"+min+"分"+s+"秒"); 方法三: SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date begin=dfs.parse("2004-01-02 11:30:24"); java.util.Date end = dfs.parse("2004-03-26 13:31:40"); long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒 long day1=between/(24*3600); long hour1=between%(24*3600)/3600; long minute1=between%3600/60; long second1=between%60/60; System.out.println(""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒"); ==================================================== java 比较时间大小 String s1="2008-01-25 09:12:09"; String s2="2008-01-29 09:12:11"; java.text.DateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Calendar c1=java.util.Calendar.getInstance(); java.util.Calendar c2=java.util.Calendar.getInstance(); try { c1.setTime(df.parse(s1)); c2.setTime(df.parse(s2)); }catch(java.text.ParseException e){ System.err.println("格式不正确"); } int result=c1.compareTo(c2); if(result==0) System.out.println("c1相等c2"); else if(result<0) System.out.println("c1小于c2"); else System.out.println("c1大于c2");
在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。有些人可能会疑惑Invisible和gone是有什么区别的???那么,我们带着这个疑问看下面:
其在XML文件和Java代码中设置如下: 可见(visible) XML文件:android:visibility="visible" Java代码:view.setVisibility(View.VISIBLE);
不可见(invisible) XML文件:android:visibility="invisible" Java代码:view.setVisibility(View.INVISIBLE);
隐藏(GONE) XML文件:android:visibility="gone" Java代码:view.setVisibility(View.GONE); 为了区别三者,我建了一个Dome进行演示,先上Dome的代码,演示后就知道它们的区别: main.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 <LinearLayout 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:orientation="horizontal" 10 android:layout_marginBottom="20dip" > 11 <TextView 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:layout_weight="1" 15 android:background="#FF0000" 16 android:text="TextView1" /> 17 <TextView 18 android:id="@+id/textView2" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:layout_weight="1" 22 android:background="#0000FF" 23 android:text="TextView2" /> 24 </LinearLayout> 25 <Button 26 android:id="@+id/btn1" 27 android:layout_width="fill_parent" 28 android:layout_height="wrap_content" 29 android:text="TextView2为VISIBLE" /> 30 <Button 31 android:id="@+id/btn2" 32 android:layout_width="fill_parent" 33 android:layout_height="wrap_content" 34 android:text="TextView2为INVISIBLE" /> 35 <Button 36 android:id="@+id/btn3" 37 android:layout_width="fill_parent" 38 android:layout_height="wrap_content" 39 android:text="TextView2为GONE" /> 40 </LinearLayout> MyButtonDemo.class: 1 package com.gaolei.demo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 public class MainActivity extends Activity implements OnClickListener { 11 private TextView textView2; 12 private Button btn1; 13 private Button btn2; 14 private Button btn3; 15 16 @Override 17 public void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.main); 20 21 textView2 = (TextView) this.findViewById(R.id.textView2); 22 23 findView(); 24 bindView(); 25 26 } 27 28 private void findView() { 29 btn1 = (Button) this.findViewById(R.id.btn1); 30 btn2 = (Button) this.findViewById(R.id.btn2); 31 btn3 = (Button) this.findViewById(R.id.btn3); 32 } 33 34 private void bindView() { 35 btn1.setOnClickListener(this); 36 btn2.setOnClickListener(this); 37 btn3.setOnClickListener(this); 38 } 39 40 public void onClick(View v) { 41 switch (v.getId()) { 42 case R.id.btn1: 43 // 设置TextView2可见 44 textView2.setVisibility(View.VISIBLE); 45 break; 46 case R.id.btn2: 47 // 设置TextView2不可见 48 textView2.setVisibility(View.INVISIBLE); 49 break; 50 case R.id.btn3: 51 // 设置TextView2隐藏 52 textView2.setVisibility(View.GONE); 53 break; 54 55 default: 56 break; 57 } 58 } 59 } visible:invisible:gone:由上面的演示可知 VISIBLE:设置控件可见 INVISIBLE:设置控件不可见 GONE:设置控件隐藏
而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。
在开发android 时不能查看源码必是很不爽的一件事,看过网上一些文章后(都是2.0以前的版本,跟我的2.2最新版本的配置是不一样的)不过还是给了我启示,通过配置终于可以在eclipse中查看源码了! 先下载源码,最新为2.21. 源码地址:http://rgruet.free.fr/public/2.找SDK目录安装的SDK到我的目录E:\E:\android-sdk-windows\ 找到目录 结构如下:E:\android-sdk-windows\ -platforms +android-2 +android-3 +android-.... +android-8(数字代表api版本)最高的android-8对应的是SDK2.2ok就是这个了!!在android-8文件中新建sources然后把源码解压到这个文件下3.改配置文件找到android-8目录下的文件source.properties修改如下 ### Android Tool: Source of this archive.#Wed Oct 13 14:00:16 CST 2010Pkg.Desc=Android SDK Platform 2.2_r1Pkg.UserSrc=trueArchive.Arch=ANYPlatform.Version=2.2Pkg.DescUrl=sourcesArchive.Os=WINDOWSPkg.SourceUrl=sourcesPkg.Revision=2AndroidVersion.ApiLevel=8OK重启myecplise然后按ctril+关键字、类名 看是不是可以点进去了,可以看到源码了吧!!很cool吧!注意不同的源码和sdk对应关系!!!作者:蓝之风 出处:http://www.cnblogs.com/vaiyanzi/
方法1: 将源码包移到非workspace目录下,然后new -> other-> Android -> Android Project from Exist Code
方法2: 查看项目目录中是否有隐藏文件.project,还有目录结构也还要有一个隐藏文件.classpath, 如果没有的解决办法。可以把其它项目的.project, .classpath文件拷贝过来,修改相应的地方则可。 1).project文件只需要修改<name>AboxTVExchange</name>这个项目名称则可 2) .classpath文件通常不用改,内容如下: <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="gen"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="output" path="bin"/> </classpath> kind= "... "是指这个目录在project中的类型。kind= "src "为源文件目录, 这个目录下的文件会被编译器编译. kind= "output "是java文件编译输出 目录,src目录下的文件会编译到这个目录下。 当修改项目属性-> java build path时这个文件会被自动修改
1.项目右键 ->android tools->Fix Project
2.如果不可以,检查Project->Properties->Java Compiler
确认Compiler compliance level被设置为1.6,并且Enable project specific settings.
去除ListView滑到顶部和底部时边缘的黑色阴影:
android:fadingEdge="none"
----------------------------------------------------
去除拖动时默认的黑色背景:
android:cacheColorHint="#00000000"
或
listView.setCacheColorHint(Color.TRANSPARENT);
----------------------------------------------------
去除选中时的黄色底色:
android:listSelector="#00000000"
或 listView.setSelector(new ColorDrawable(Color.TRANSPARENT)); --------------------------------------------------- 去除行与行之间的黑线: android:divider=" #00000000 " 或 listView.setDivider(null); --------------------------------------------------- ListView刷新后自动滚到最底部: listView.setSelection( listView .getAdapter().getCount()-1);
Android的Toast是一个很常用的消息提示组件,开发的时候一般是用 Toast.makeText(context, text, duration).show();
来显示一条toast。这种方法有一个问题,如果一条旧消息没有消失以前,又产生了一条新消息,这时候新消息必须等待旧消息消失才能出现。然而实际情况中,我们通常更期望的表现是旧消息马上中止,新消息立刻出现。(不及时的通知不是好通知) 那么怎样才能达到这种效果呢? 1 Toast toast ; 2 if(toast == null){ 3 toast = Toast.makeText(this,"",Toast.LENGTH_SHORT) ; 4 } 5 toast.setText("这样木有延时呢!!!") ; 6 toast.show() ;
例如: activity_main.xml:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 6 <Button 7 android:id="@+id/btn1" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:text="按钮1" /> 11 12 <Button 13 android:id="@+id/btn2" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="按纽2" /> 17 18 </LinearLayout> MainActivity.java:
1 package com.gaolei.study; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.Toast; 9 10 import com.notting.work.R; 11 12 public class MainActivity extends Activity { 13 private Button button1; 14 private Button button2; 15 private Toast toast; 16 17 @Override 18 public void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 button1 = (Button) this.findViewById(R.id.btn1); 23 button2 = (Button) this.findViewById(R.id.btn2); 24 25 button1.setOnClickListener(new OnClickListener() { 26 27 public void onClick(View v) { 28 // if (toast == null) { 29 // toast = Toast.makeText(MainActivity.this, "", 30 // Toast.LENGTH_SHORT); 31 // } 32 // toast.setText("2012"); 33 // toast.show(); 34 35 toast = Toast.makeText(MainActivity.this, "2012", Toast.LENGTH_SHORT); 36 toast.show(); 37 } 38 }); 39 40 button2.setOnClickListener(new OnClickListener() { 41 42 public void onClick(View v) { 43 // if (toast == null) { 44 // toast = Toast.makeText(MainActivity.this, "", 45 // Toast.LENGTH_SHORT); 46 // } 47 // toast.setText("2013"); 48 // toast.show(); 49 50 toast = Toast.makeText(MainActivity.this, "2013", Toast.LENGTH_SHORT); 51 toast.show(); 52 } 53 }); 54 } 55 }
前言:略!获取源码的原因千千万~~~ 1. 安装GIT工具。 GIT是林纳斯·托瓦兹大神为了管理器Linux内核开发而创立的分布式版本控制软件。 下载地址:http://code.google.com/p/msysgit/ 一路next将安装进行到底。 2. 在磁盘剩余空间较大的磁盘下新建一个文件夹,用于存放源码。 我在F盘下:新建了androidsourcecode文件夹。 3. 访问Android源码网站,获取你所需要的源码“下载链接”。 网站地址:https://github.com/android 查找需要的源码,比如Music的源码。 位于platform/packages/apps/Music.git 下,点击进入。 注意:有些源码虽然名字在网站上显示,但是被移除了,比如闹钟程序,老版本的AlarmClock就被 删除了,新版本的为DeskClock。自己可以进入相应的目录下看一下,我就不截图了。曾经在这上面吃过亏,就提出来供大家注意一下。 进入后会在页面顶部看到下载方法: To clone one of these trees, install git, and run: git clone https://github.com/android + project path.
To clone the entire platform, install repo, and run: mkdir mydroid cd mydroid repo init -u https://github.com/android/platform/manifest.git repo sync
再往下有Music源码的URL: https://github.com/android /platform/packages/apps/Music.git 拷贝一下。 4. 使用GIT下载。 在第二步新建的文件夹下右键单击,弹出菜单后点击“Git Bash”,进入GIT命令行窗口。 输入 git clone ,然后粘贴第3步拷贝的URL 。 说明:粘贴方法为: 右键单击命令行窗口顶部,弹出菜单,点击编辑,再点粘贴就行了: 点击键盘Enter(回车),就开始下载。
上面有进度百分比,慢慢等就行了 下载完后就可以使用Eclipse打开了。 别忘了下载完后输入exit推出GIT
卸载ADT的方法,方法如下(我的Eclipse版本为3.5): 1、选择 Help > Install New Software; 2、在"Details" 面板中, 点击"What is already installed?" 链接; 3、在Eclipse Installation Details 对话框中,选择"Android DDMS"和"Android Development Tools" ,然后点击Uninstall; 4、在下一个窗口中,确认要删除的ADT,然后点击Finish进行删除; 5、重启Eclipse.
安装ADT插件的地址是https://dl-ssl.google.com/android/eclipse/ ,选择 Help > Install New Software即可看见选项。另外也可以在官方地址下载离线安装包,在这个界面里面安装。不建议直接解压缩粘贴进eclipse目录。
Failed to fectch URl https://dl-ssl.google.com/android/repository/addons_list.xml, reason: Connection to https://dl-ssl.google.com refused 解决办法来源于:code.google.com - 用notepad打开C:\WINDOWS\system32\drivers\etc中的hosts文件
- 在最后一行添加74.125.237.1 dl-ssl.google.com
- 成功解决问题。
|
做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流。 一 应用规划: ※确定功能。 ※必须的界面及界面跳转的流程。 ※需要的数据及数据的来源及格式。 ※是否需要服务端支持。 ※是否需要本地数据库支持。 ※是否需要特殊权限。 ※是否需要后台服务。 三 界面设计: ※主界面确定。 ※模块界面、列表、查看、编辑界面。 ※菜单、按钮、对话框、提示信息。 ※界面总体颜色。 四 数据操作和存储: ※数据来源。 ※数据类型。 ※存储方式。 六 页面跳转: ※每个页面间的跳转。 ※菜单、按钮、事件等。 关键字: android app, android develop, android summary 从2010.04启动该项目到现在完成主要功能模块,分享一下开发历程和注意事项。 开发环境: ubuntu7.10 + eclipse 3.5 + sdk 下面是开发总结: 1. 基于源码级的SDK以及SDK升级注意事项 o 熟悉其如何做资源国际化 o 熟悉其如何支持不同屏幕大小,不同density介质 o 熟悉其主要的API以及支持的最低版本和不被再支持的API o 了解其分层架构 o 升级SDK 确保该平台支持相关的cglib版本(否则要升级ubuntu) 简单容行的方式是remove ~/.android下的相关东西,remove先前的相关版本,再升级 部分Resources(如strings中有%s的)可能需要修改才能适应新的版本 新的sdk里可能不包括老的如2.01版本 2. Emulator & Mobile o 用adb shell 操作emulator http://www.javaeye.com/topic/260042 o push / pull file in emulator Eclipse->window->Show View->File Explorer-> pull a file from the device(or push a file onto the device) o 用 real mobile连接usb来直接测试(mobile 必须设置为develop/debug mode) http://dimitar.me/how-to-connect-your-android-phone-to-ubuntu-to-do-developmenttestinginstallations-or-tethering/ o emulator更能用于性能测试,功能测试。而mobile更适合触摸操作测试和一些View的真实展现测试 o 屏幕大小适应测试(枚举大,中,小),屏幕方向(枚举横,竖屏),任务切换测试 o 内存适应只能在mobile上做测试 3. 系统配置项 o SharedPreferences存储位置及如何在emulator上手动修改 找到存储位置: \data\data\your package dir\shared_prefs\your xml files 按照上面的pull/push the file o SQLite(sqlite3) 默认存储位置:\data\data\your package dir\databases\your database name o Other File I/O assert下文件读取 文件权限以及读写 o 解读AndroidManifest.xml application/process标识 最开始启动的activity activity栈的形式(指定taskAffinity&launchMode="singleTask"),而且转向一个新的activity是用intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)的形式 需要的权限部分 支持的最低版本 4. 基于View,Context,Manager的开发 o 系统View & Layout(Layout也是View) . 用View本身来做其他Layout间的一个分隔 . 常用的View&Layout: ListView,ScrollView,RelativeLayout,TableLayout . 设计常用的style/theme用到的Drawable: http://idunnolol.com/android/drawables.html . 常用的图片操作 . 指定颜色的渲染(setColorFilter) . 剪裁 o 自定义View & Layout . Java代码 public class TouchListView extends ListView { public TouchListView(Context context, AttributeSet attrs, int defStyle) { } } public class Toolbar extends LinearLayout { public Toolbar(final Context context) { super(context); } public Toolbar(final Context con, AttributeSet attrs) { } } activity跳转 sendBroadcast(实时数据交换可借助Thread+ BroadcastReceiver) o WindowManager 、PackageManager 等的使用 2. 网络IO o java.net o android.net o org.apache.http 如果没有让他在AsyncTask中操作,则他的TimeOut设置必须少于5秒(为ANR等待时间) java.net.UnknownHostException 如果发生在emulator,可参考: http://www.javaeye.com/topic/521023 如果发生在mobile,则一般是DNS解析问题,要么允许用户再重试操作,要么把Host的域名改为public ip address 3. 绘图部分 o 在View上绘图 只在原来View上加边框等 Java代码 @Override protected void dispatchDraw(Canvas canvas) {} @Override protected void onDraw(Canvas canvas) { Bitmap result = Bitmap.createBitmap(48,48, Config.ARGB_8888); Canvas canvas = new Canvas(result); ... canvas.drawBitmap(result, rect, rect, paint); 2. 动画 o 帧动画 控制侦速率在25FPS以让其更流畅 o 渐变动画 平移 缩放 旋转 透明 3. ANR o 构建消息以及消息循环处理Handler o 使用AsyncTask 4. Exception & UncaughtException o 使用UncaughtExceptionHandler 5. 引入第三方jar以及与其他app共享数据 o 通过add user library方式添加第三方jar o Content Provider的使用 6. 性能优化/调优 o 基于View的优化http://dl.javaeye.com/topics/download/774b3e9e-1c48-33bd-bc9d-5c27da998181 o 代码级的规范 o Method级的调优 Method Profiling(如果直接usb连接mobile,需要root权限作此项) o GC分析 使用Allocation Tracker /Files/gaolei-xj/Android_app项目开发步骤总结.pdf
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|
常用链接
留言簿
随笔分类
随笔档案
文章分类
搜索
最新评论
阅读排行榜
评论排行榜
|
|