您的位置:首页 > 移动开发 > Android开发

Android学习笔记-常用的一些源码,防止忘记了。。。

2011-06-16 00:31 411 查看
Android 学习笔记

1.
 
长点击控件菜单,即我们常说的右键菜单,不过好像ContextMenu不支持ICON的,
 
所以即使在源码里面可以使用setIcon函数,但是还是不会有效果的。。。
 
一般有下面三个步骤:
 
// 通常在onCreate函数中注册一个控件,btn为需要弹出ContextMenu的控件
 
this.registerForContextMenu(btn);
 
///////////////////////////////////////////////////////////////////////////////
 
// 下面函数是创建ContextMenu的,v是被点击的控件
 
// 根据v进行判断可以对不同的控件,创建不同的ContextMenu
 
public void onCreateContextMenu(ContextMenu menu, View v,
 
ContextMenuInfo menuInfo)
 
///////////////////////////////////////////////////////////////////////////////
 
// 下面函数是响应ContextMenu点击事情的。。
 
public boolean onContextItemSelected(MenuItem item)

2.
 
Toast显示信息,可以方便的来输出信息
 
Toast.makeText(this, "Info", Toast.LENGTH_LONG).show();

3.
 
关于MENU的操作
 
有两个比较重要的了,函数原型:
 
public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title);
 
public abstract SubMenu addSubMenu (CharSequence title);
 
一般的函数有:
 
menu.setHeaderTitle("MenuTitle");
 
menu.setHeaderIcon(R.drawable.icon);
 
menu.add(0, 0, 0, "item0").setIcon(R.drawable.icon);
 
menu.add(0, 1, 1, "item1");
 
///////////////////////////////////////////////////////////////////////////////
 
SubMenu sub = menu.addSubMenu("SubMenu");
 
sub.add(0, 5, 5, "item5");
 
sub.add(0, 6, 6, "item6");

4.
 
获取屏幕的分辨率
 
isplayMetrics dm = new DisplayMetrics();
 
getWindowManager().getDefaultDisplay().getMetrics(dm);
 
dm.widthPixels
 
dm.heightPixels

5.
 
显示POPUP对话框,类似于Windows的MessageBox函数,不过这个要比MessageBox强大多了,,,
 
可以设置单选或者多选项,以及其响应,有两种方法可以
 
一:
 
实现Activity的onCreateDialog函数。
 
showDialog(ID_TEST_DIALOG);
 
protected Dialog onCreateDialog(int id) {
 
// TODO Auto-generated method stub
 
switch (id) {
 
case ID_TEST_DIALOG:
 
Dialog dialog = new AlertDialog.Builder(this)
 
.setTitle("AlertDialog Test")
 
.setMessage("This is a test for AlertDialg!")
 
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
 
public void onClick(DialogInterface dialog, int which) {
 
// TODO Auto-generated method stub
 

}
 
})
 
.create();
 
return dialog;
 
default:
 
break;
 
}
 
return super.onCreateDialog(id);
 
}
 
这里有个配套的函数
 
dismissDialog(D_TEST_DIALOG);
 
这个可以关闭相应的Dialog.
 
///////////////////////////////////////////////////////////////////////////////
 
二:
 
直接调用Builder函数去完成创建与显示。
 
new AlertDialog.Builder(this)
 
.setTitle("AlertDialog Test")
 
.setMessage("This is a test for AlertDialg!")
 
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
 
public void onClick(DialogInterface dialog, int which) {
 
// TODO Auto-generated method stub
 

}
 
})
 
.show();

6.
 
从一个xml布局获取其View的方法。
 
这个好像有两种方法,不过都是得到一个LayoutInflater之后再inflate得到指定xml布局相对应的View.
 
一:
 
LayoutInflater li;
 
li = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
 
View v = li.inflate(R.layout.la_test, null);
 
二:
 
LayoutInflater li;
 
li = LayoutInflater.from(this);
 
View v = li.inflate(R.layout.la_test, null);

7.
 
知道第二个方法和第六个方法之后,我们可以把这两个方法综合起来。
 
就是可以自定义的显示一段时间的图形,这个说法有点抽象,简单一点就是做一个类似音量调节那样的浮动窗口。
 
思路是这样的,可以新建一个Toast,然后再inflate一个布局,设置里面的内容,然后再把内容放到Toast里面显示
 
LayoutInflater li;
 
li = LayoutInflater.from(this);
 
View v = li.inflate(R.layout.la_test, null);
 
Toast toast = new Toast(this);
 
toast.setDuration(Toast.LENGTH_LONG);
 
toast.setView(v);
 
toast.show();

8.
 
当按返回键时,完全按退出系统
 
@Override
 
protected void onDestroy() {
 
// TODO Auto-generated method stub
 
android.os.Process.killProcess(android.os.Process.myPid());
 
super.onDestroy();
 
}
 
@Override
 
public boolean onKeyDown(int keyCode, KeyEvent event) {
 
// TODO Auto-generated method stub
 
if (keyCode == KeyEvent.KEYCODE_BACK) {
 
finish();
 
return true;
 
}
 
return super.onKeyDown(keyCode, event);
 
}

9.
 
获取状态栏和标题栏的高度
 
获取状态栏高度:
 
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。
 
于是,我们就可以算出状态栏的高度了。
 
Rect frame = new Rect(); 
 
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); 
 
int statusBarHeight = frame.top;
 
获取标题栏高度:
 
getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
 
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
 
//statusBarHeight是上面所求的状态栏的高度 
 
int titleBarHeight = contentTop - statusBarHeight 

10.
 
关于窗口的一些操作
 
不显示标题栏
 
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
 
或者是设置一个style属性,主题,加入下面的项
 
<item name="android:windowNoTitle">true</item>

设置背景半暗
 
LayoutParams lp = getWindow().getAttributes();
 
lp.dimAmount = 0.5f;
 
// 设置透明度是alpha的值
 
// lp.alpha = 0.8f;
 
getWindow().setAttributes(lp);
 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

设置背景模糊
 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
 
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

一般可能有用的style设置,以防以后忘记了,,,
 
<item name="android:windowBackground">@drawable/color_translucent</item>
 
<item name="android:windowIsTranslucent">true</item>

11.
 
获取SD卡总空间和可用空间
 
public static String getSDcardStorage() {
 
String state = Environment.getExternalStorageState();
 
if(Environment.MEDIA_MOUNTED.equals(state)) {
 
File sdcardDir = Environment.getExternalStorageDirectory();
 
   StatFs sf = new StatFs(sdcardDir.getPath());
 
   long blockSize = sf.getBlockSize();
 
   long blockCount = sf.getBlockCount();
 
   long availCount = sf.getAvailableBlocks();
 
   return "SD卡:" + formatSize(blockSize*blockCount)
 
    + " 可用空间:" + formatSize(availCount*blockCount);
 
}
 
return null;
 
}

获取系统空间和可用空间
 
public static String getSystemStorage() {
 
File root = Environment.getRootDirectory();  
 
        StatFs sf = new  StatFs(root.getPath());  
 
        long  blockSize = sf.getBlockSize();  
 
        long  blockCount = sf.getBlockCount();  
 
        long  availCount = sf.getAvailableBlocks();  
 
        return "总空间:" + formatSize(blockSize*blockCount)
 
     + " 可用空间:" + formatSize(availCount*blockSize);
 
    }

12.
 
在资源文件中使用Android定义的资源的方法
 
在Android系统中定义了很多动画与样式,我们可能在eclipse开发程序的时候使用系统定义的资源,
 
哈哈,这样可以保持与系统显示的样式一致~~~
 
对于定义为:android.R.drawable.status_bar_item_background的样式,
 
只需在eclipse的资源文件中写为:@android:drawable/status_bar_item_background
 
总结一下,所以可以写为下面的样子。。。
 
android:background="@android:drawable/status_bar_item_background"

13.
 
Android.mk文件的说明。
 
JAR: include $(BUILD_JAVA_LIBRARY),源文件为java
 
SO:include $(BUILD_SHARED_LIBRARY),源文件为 c或c++
 
APK:include $(BUILD_PACKAGE),源文件为java
 
二进制可执行文件:include $(BUILD_EXECUTABLE),源文件为c或c++

如需要在java文件中调用so文件,如:libabc.so则需在Android.mk文件中添加:
 
LOCAL_JNI_SHARED_LIBRARIES := libabc
 
同时,需要在java文件中System.loadLibrary("abc");,注意此时不需要在加上lib前缀

14.
 
模拟按键消息
 
private void sendVKeyDelay(int key) {
 
final int keyCode = key;
 
Thread sendKeyDelay = new Thread(){
 
public void run() {
 
try {
 
Thread.sleep(100);
 

long now = SystemClock.uptimeMillis();
 
KeyEvent keyDown = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,
 
keyCode, 0);
 
IWindowManager wm = IWindowManager.Stub.asInterface(
 
ServiceManager.getService("window"));
 
wm.injectKeyEvent(keyDown, false);
 

KeyEvent keyUp = new KeyEvent(now, now, KeyEvent.ACTION_UP,
 
keyCode, 0);
 
wm.injectKeyEvent(keyUp, false);
 
} catch (InterruptedException e) {
 
e.printStackTrace();
 
} catch (RemoteException e) {
 
e.printStackTrace();
 
}
 
}
 
};
 
sendKeyDelay.start();
 
}

15.
 
使用startActivity应该注意的异常,处理各种情况跟异常!!!
 
    void startActivitySafely(Intent intent) {
 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
        try {
 
            startActivity(intent);
 
        } catch (ActivityNotFoundException e) {
 
            Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
 
        } catch (SecurityException e) {
 
            Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
 
            e(LOG_TAG, "Launcher does not have the permission to launch " + intent +
 
                    ". Make sure to create a MAIN intent-filter for the corresponding activity " +
 
                    "or use the exported attribute for this activity.", e);
 
        }
 
    }

16.
 
创建动画效果。
 
public void createAnimation() {
 
if (mInAnimation == null) {
 
mInAnimation  = new AnimationSet(false);
 
final AnimationSet ani = mInAnimation;
 
ani.setInterpolator(new AnticipateOvershootInterpolator(2.5f));
 
ani.addAnimation(new AlphaAnimation(0.0f, 1.0f));
 
ani.addAnimation(new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
 
Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, -1.0f,
 
Animation.RELATIVE_TO_SELF, 0.0f));
 
ani.setDuration(1000);
 
}
 
if (mOutAnimation == null) {
 
mOutAnimation = new AnimationSet(false);
 
AnimationSet ano = mOutAnimation;
 
ano.setInterpolator(new AnticipateOvershootInterpolator(2.5f));
 
ano.addAnimation(new AlphaAnimation(1.0f, 0.0f));
 
ano.addAnimation(new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
 
Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
 
Animation.RELATIVE_TO_SELF, -1.0f));
 
ano.setDuration(1000);
 
}
 
}

17.
 
显示一个浮动的窗口(任意View).
 
mWindowManager = (WindowManager)getSystemService(
 
Context.WINDOW_SERVICE);
 
mDialog = LayoutInflater.from(mContext).inflate(
 
R.layout.popup, null);
 
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
 
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
 
(int)event.getX(), (int)event.getY(),
 
WindowManager.LayoutParams.TYPE_APPLICATION,
 
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
 
PixelFormat.TRANSLUCENT);
 
lp.gravity = Gravity.TOP | Gravity.LEFT;
 
mWindowManager.addView(mDialog, lp);
 
如果需要隐藏,则remove即可
 
mWindowManager.removeView(mDialog);

18.
 
设置应用程序全屏显示
 
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

19.
 
获取系统所有的安装程序
 
final PackageManager packageManager = getPackageManager();
 
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
final List<ResolveInfo> apps = packageManager.queryIntentActivities(mainIntent, 0);

20.
 
手机振动,代码片段。
 
Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
 
vibrator.vibrate(pattern, -1);
 
需要在AndroidManifest.xml文件添加权限
 
<uses-permission android:name="android.permission.VIBRATE" />

21.
 
设置开机运行程序,需要在AndroidManifest.xml中添加
 
<intent-filter>
 
<!-- 系统启动完成后会调用-->
 
<action android:name="android.intent.action.BOOT_COMPLETED" />
 
</intent-filter>

22.
 
简单的使用ListView的方法,
 
一,单行文字的
 
List<String> list = new ArrayList<String>();
 
lvData.setAdapter(new ArrayAdapter(this,
 
android.R.layout.simple_list_item_1, list));
 
二,双行文字,使用SimpleAdapter
 
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
 
HashMap<String, String> map = new HashMap<String, String>();
 
map.put("ID", cursor.getString(0));
 
map.put("UserName", cursor.getString(1));
 
list.add(map);
 
lvData.setAdapter(new SimpleAdapter(this, list,
 
android.R.layout.simple_expandable_list_item_2,
 
new String[]{"ID","UserName"},
 
new int[]{android.R.id.text1, android.R.id.text2}));

23.
 
SQLiteDatabase中模拟使用Truncate方法清空数据表跟计数器的方法
 
先使用"DELETE FROM TableName"语句清空数据表数据
 
再使用"UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME=/"TableName/""置0计数器
 
下面是清空表“Users”
 
try {
 
mDatabase.execSQL("DELETE FROM Users");
 
mDatabase.execSQL("update sqlite_sequence set seq=0 where name=/"Users/"");
 
} catch (SQLException se) {
 
Toast.makeText(this, se.getMessage(), Toast.LENGTH_LONG).show();
 
se.printStackTrace();
 
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Yao_GUET/archive/2011/03/30/6289185.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息