【Android】开发中的小技术(持续更新)
【特】Android源码下载
1.WebView加载各种类型的网页
//打开本包内asset目录下的index.html文件 wView.loadUrl(" file:///android_asset/index.html "); //打开本地sd卡内的index.html文件 wView.loadUrl("content://com.android.htmlfileprovider/sdcard/index.html"); //打开指定URL的html文件 wView.loadUrl(" http://m.oschina.net");
2.在一个应用程序中启动另外一个应用程序
Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName("com.android.androidweb", "com.android.androidweb.AndroidWeb"); //前面是包名,后面是主类名 intent.setComponent(cn); startActivity(intent);
下面记录一个很特殊的,是系统自带的相册程序:
Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName("com.android.gallery", "com.android.camera.GalleryPicker"); intent.setComponent(cn); startActivity(intent);
知道包名获取启动类的方法:
PackageManager pm = getPackageManager(); PackageInfo pi; try { pi = pm.getPackageInfo("com.android.androidweb", 0);//此处加入包名~ Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(pi.packageName); List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0); ResolveInfo ri = apps.iterator().next(); if (ri != null ) { String packageName = ri.activityInfo.packageName; String className = ri.activityInfo.name; Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); startActivity(intent); } } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
6.SQLite数据库中实现ID自增
将字段声明为:INTEGER PRIMARY KEY AUTOINCREMENT
7.读取返回的Cursor的内容
1 Cursor cursor = ThumbnailsImages.queryPicDirectory(getContentResolver()); 2 String display = ""; 3 cursor.moveToFirst(); 4 while(!cursor.isAfterLast()){ 5 display = display + cursor.getString(0) + "/"; 6 display = display + cursor.getString(1) + "/"; 7 cursor.moveToNext(); 8 } 9 view.setText(display); 10 cursor.close();
10.文件过滤器
1 mFiles = mDirectory.listFiles(new FilenameFilter() { 2 public boolean accept(File file, String name) { 3 if (name.toLowerCase().endsWith(".pdf")) 4 return true; 5 if (name.toLowerCase().endsWith(".xps")) 6 return true; 7 if (name.toLowerCase().endsWith(".cbz")) 8 return true; 9 return false; 10 } 11 }); 12 13 Arrays.sort(mFiles, new Comparator<File>() { 14 public int compare(File arg0, File arg1) { 15 return arg0.getName().compareToIgnoreCase(arg1.getName()); 16 } 17 });
11.操作软键盘(出现和隐藏)
1 void showKeyboard() { 2 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 3 if (imm != null) 4 //mSearchText是一个搜索输入框(EditText) 5 imm.showSoftInput(mSearchText, 0); 6 } 7 8 void hideKeyboard() { 9 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 10 if (imm != null) 11 imm.hideSoftInputFromWindow(mSearchText.getWindowToken(), 0); 12 }
12.移动Dialog的位置
1 Dialog dialog = new Dialog(this); 2 3 // setContentView可以设置为一个View也可以简单地指定资源ID 4 // LayoutInflater 5 // li=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 6 // View v=li.inflate(R.layout.dialog_layout, null); 7 // dialog.setContentView(v); 8 dialog.setContentView(R.layout.dialog_layout); 9 10 dialog.setTitle("Custom Dialog"); 11 12 /* 13 * 获取圣诞框的窗口对象及参数对象以修改对话框的布局设置, 14 * 可以直接调用getWindow(),表示获得这个Activity的Window 15 * 对象,这样这可以以同样的方式改变这个Activity的属性. 16 */ 17 Window dialogWindow = dialog.getWindow(); 18 WindowManager.LayoutParams lp = dialogWindow.getAttributes(); 19 dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP); 20 21 /* 22 * lp.x与lp.y表示相对于原始位置的偏移. 23 * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略. 24 * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略. 25 * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略. 26 * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略. 27 * 当参数值包含Gravity.CENTER_HORIZONTAL时 28 * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动. 29 * 当参数值包含Gravity.CENTER_VERTICAL时 30 * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动. 31 * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL | 32 * Gravity.CENTER_VERTICAL. 33 * 34 * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在 35 * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了, 36 * Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离 37 */ 38 lp.x = 100; // 新位置X坐标 39 lp.y = 100; // 新位置Y坐标 40 lp.width = 300; // 宽度 41 lp.height = 300; // 高度 42 lp.alpha = 0.7f; // 透明度 43 44 // 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes 45 // dialog.onWindowAttributesChanged(lp); 46 dialogWindow.setAttributes(lp); 47 48 /* 49 * 将对话框的大小按屏幕大小的百分比设置 50 */ 51 // WindowManager m = getWindowManager(); 52 // Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用 53 // WindowManager.LayoutParams p = getWindow().getAttributes(); // 获取对话框当前的参数值 54 // p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6 55 // p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.95 56 // dialogWindow.setAttributes(p); 57 58 dialog.show();
13.数据库操作
Android中结合OrmLite for android组件对SQLite的CRUD(增删改查)操作实例
14.环形ProgressBar的实现
1 android:fromDegrees="0" 2 android:pivotX="50%" 3 android:pivotY="50%" 4 android:toDegrees="360" > 5 6 7 android:innerRadiusRatio="3" 8 android:shape="ring" 9 android:thicknessRatio="30" 10 android:useLevel="false" > 11 12 13 android:centerColor="#FFFFFF" 14 android:centerY="0.01" 15 android:endColor="#FFFFFF" 16 android:startColor="#000000" 17 android:type="sweep" 18 android:useLevel="false" />
1 <ProgressBar 2 android:layout_width="wrap_content" 3 android:layout_height="wrap_content" 4 android:layout_gravity="center_horizontal" 5 android:indeterminateDrawable="@drawable/wel_act_loading_pro" 6 />
gradient里的属性没什么好介绍的, 这里主要是shape.
下列属性只在android:shape=”ring”时使用:
android:innerRadiux
尺寸值,它用尺寸值或尺寸资源指定圆环内部的半径(指中间的圆孔的半径)。
android:innerRadiusRatio
浮点值,它用圆环宽度的比率来表示内部圆环的半径。例如,如果android:innerRadiusRatio=”5”,那么内部半径就等于圆环的宽度除以5。这个值会被android:innerRadius的值覆盖。默认是9。
android:thickness
尺寸值,它用一个尺寸值或尺寸资源来定义圆环的厚度。
android:thicknessRatio
浮点值。它用圆环宽度的比率来表示圆环的厚度。例如,如果android:thicknessRatio=”2”,那么厚度就等于圆环的宽度除以2。这个值会被android:innerRadius覆盖。默认值是3。也就是说这个值设置的越大圆环就越细了。
android:useLevel
布尔值,如果这个形状要用于LevelListDrawable对象,那么就设置为true。通常应该设置为false或者让形状不可见。
15、Notification中如何打开一个已经存在的Activity?
Notification并不要求一定重新启动一个全新的Activity(如果已经存在),如果想要打开一个已经存在的Activity,则将生成PendingIntent的intent设置为:
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
即可。