1、java一行一行读取文件:
InputStreamReader is = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(is);
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
Log.i("csdn", sb.toString());
2、设置activity的样式是dialog
在AndroidManifest.xml中加入:android:theme="@android:style/Theme.Dialog"
当然我们也可以自定义样式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyDialog" parent="android:style/Theme.Dialog">
<!-- 背景颜色及透明程度 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 是否有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否模糊 -->
<item name="android:backgroundDimEnabled">true</item>
</style>
</resources>
在设置了activity的样式是dialog后点击其他的地方activity会消失,为了不让其消失可以调用:setFinishOnTouchOutside(false);默认参数是true,当然如果显示的是new出来的一个dialog那么可以调用:
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
3、自定义标题栏
首先新建一个xml布局文件,对布局中的内容可以随便设置
然后在onCreate函数中加入代码:
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebtn);
4、让activity去标题栏全屏显示
4.1常用方法:
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
或者是:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
4.2 在application或activity中加入
android:theme="@android:style/Theme.NoTitleBar"
5、解决音乐播放器中会出现录音的音频文件:
MediaStore.Audio.Media.IS_MUSIC这个比较关键,在查询的时候加入条件MediaStore.Audio.Media.IS_MUSIC=1就可以了
6、按back键彻底关闭应用程序
最近遇到了按back键退出程序后再次点击但是运行效果和第一次运行不一样的情况,最后在onDestroy函数中加上:System.exit(0);就可以了
7、android4.4修改launcher默认显示第几页
在Launcher模块中的WorkSpace.java文件中有一个mDefaultPage变量,这个变量又是通过getInt(R.styleable.Workspace_defaultScreen, 1);获取的,所以我们查看相关的布局文件,在launcher.xml文件中,看到:
<com.android.launcher3.Workspace
android:id="@+id/workspace"
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
launcher:pageSpacing="@dimen/workspace_page_spacing"
launcher:pageIndicator="@id/page_indicator">
</com.android.launcher3.Workspace>
有一个defaultScreen属性,在这个属性中是通过config_workspaceDefaultScreen值获得的,所以在config.xml中修改config_workspaceDefaultScreen的值就可以了!
8、异常捕获的问题
最近用到了AIDL远程服务,但是在调用某个接口的时候一直报出异常,异常开始的位置是通过aidl文件自动生成的java文件,原先我以为这个异常在我自己的代码中并不能捕获,但事实是异常也是会一层一层往上传递的,所以我们可以在自己的代码位置捕获异常,这样就避免了程序会报错的问题。
9、android在4.2之后为了区分阿拉伯语言或其他语言的情况下,因为他们是从右开始往左读的,所以我们可以在代码中通过isLayoutRtl()来判断,我们查看View.java的源码,看到:
/**
* Indicates whether or not this view's layout is right-to-left. This is resolved from
* layout attribute and/or the inherited value from the parent
*
* @return true if the layout is right-to-left.
*
* @hide
*/
@ViewDebug.ExportedProperty(category = "layout")
public boolean isLayoutRtl() {
return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}
isLayoutRtl()方法标识为@hide,所以我们外部是不可以调用了,因此我们在判断是layout is right - to - left可以通过getLayoutDirection == LAYOUT_DIRECTION_RTL就可以了。
或者我们干脆可以通过系统当前是什么语言来判断,例如:
getResources().getConfiguration().locale.getCountry().equals("CN");// 中文
getResources().getConfiguration().locale.getCountry().equals("TW");// 繁体中文
getResources().getConfiguration().locale.getCountry().equals("UK");// 英文(英式)
getResources().getConfiguration().locale.getCountry().equals("US");// 英文(美式)
getResources().getConfiguration().locale.getCountry().equals("EG");// 阿拉伯
10、在需求中有时目标图片可能尺寸太大,我们需要将图片缩小到一定的大小,可以通过下面代码实现:
if (mIconBitmap.getWidth()>context.getResources().getDimensionPixelSize(R.dimen.qhd_app_icon_size_bk)) {
int app_icon_size = context.getResources().getDimensionPixelSize(R.dimen.qhd_app_icon_size);
mIconBitmap = Bitmap.createScaledBitmap(mIconBitmap, app_icon_size, app_icon_size, true);
}
11、Canvas.saveLayerAlphafangfa
默认的Canvas只有一个layer,所以平时我们的操作都是在一张layer上操作,有时如果我们需要多张的话就可以通过SaveLayerXXX, 来创建一些中间层,SaveLayerXXX是对layer进行入栈操作,后续的操作都是在此layer上;我们可以通过restore进行出栈操作。例如:
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.translate(10, 10);
mPaint.setColor(Color.RED);
canvas.drawCircle(75, 75, 75, mPaint);
canvas.saveLayerAlpha(0, 0, 200, 200, 0x88, LAYERS_FLAGS);
mPaint.setColor(Color.BLUE);
canvas.drawCircle(125, 125, 75, mPaint);
canvas.restore();
}
12、解决android程序退出后出现在最近任务中
在相应的activity中添加:android:excludeFromRecents="true"
13、setRotation设置控件的旋转角度
虽然setRotation可以设置控件的旋转角度,但是它的默认旋转中心点是控件的中心点,有时我们需要随便设置控件的旋转中心点,可以通过以下方法设置:
setPivotX()设置旋转中心的x坐标
setPivotY()设置旋转中心的y坐标
但是需要注意的是:有时我们直接设置getwidth()相关的坐标时,要考虑这时获取的宽度是不是真的获取到了,有时可能直接返回的是0.
14、为控件定义一个接口,然后在接口中定义一个方法,在一定的时候让控件执行这个接口的方法。我们可以在需要的时候去实现这个接口,这样控件在调用接口方法的时候调用的就是我们已经实现了的方法。
15、android实现按back键隐藏Activity但是不会销毁
public boolean onKeyDown(int keyCode, KeyEvent event) {// 点击返回键以后,不会使activity销毁,只是隐藏
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);//关键代码
return true;
}
return super.onKeyDown(keyCode, event);
}
16、android自定义字体样式
1)下载ttf字体文件
2)在assets目录下新建fonts目录
3)在需要用到的地方通过以下代码获取样式:
Typeface fontFace = Typeface.createFromAsset(getAssets(),"fonts/digital.ttf");
4)为控件指定样式:View.setTypeface(fontFace);
17、在线更改eclipse的配色方案
在help--install new software,name:ColorTheme;site:http://eclipse-color-theme.github.com/update
18、压缩图片到指定的大小(来自:http://blog.csdn.net/cherry609195946/article/details/9264409#comments)
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只读边,不读内容
bm = BitmapFactory.decodeResource(getResources(), R.drawable.albumart_mp_unknown, options);
options.inJustDecodeBounds = false;
int w = options.outWidth;
int h = options.outHeight;
float ww = 200.0f;
float hh = 200.0f;
int be = 1;
if (w>h && w>ww) {
be = (int) (w/ww);
} else if(w<=h&&h>hh){
be = (int) (h/hh);
}
if (be<=0) {
be = 1;
}
options.inSampleSize = be;//设置采样率
options.inPurgeable = true;//同时设置才有效
options.inInputShareable = true;//内存不足时可以回收
bm = BitmapFactory.decodeResource(getResources(), R.drawable.albumart_mp_unknown, options);
19、将一张图片裁剪成圆形(来自:http://blog.csdn.net/edisonlg/article/details/7084977)
Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
paint.setAntiAlias(true);
int pointX = bm.getWidth() / 2;
int pointY = bm.getHeight() / 2;
canvas.drawCircle(pointX, pointY, Math.max(pointX, pointY), paint);
paint.setXfermode(new PorterDuffXfermode(
android.graphics.PorterDuff.Mode.SRC_IN));//这里可以设置模式,设置选取重叠部分
canvas.drawBitmap(bm, 0, 0, paint);
return bmp;
20、
启动一个Activity,但不显示布局 <activity android:theme="@android:style/Theme.NoDisplay"> </activity>
21、单例模式
/** Convenience singleton for apps using a process-wide instance. */
public static Class getDefault() {
if (defaultInstance == null) {
synchronized (Class.class) {
if (defaultInstance == null) {
defaultInstance = new Class();
}
}
}
return defaultInstance;
}
22、ViewConfiguration常用的两个方法
ViewConfiguration.getPressedStateDuration() //用于检测触摸是不是长按事件
ViewConfiguration.getTapTimeout() //用于检测触摸点有没有移动
ViewConfiguration.get(context).getScaledTouchSlop() //如果滑动距离大于这个值就认为是滑动
23、IllegalArgumentException : y + height must be <= bitmap.height()
今天在launcher代码中缩放图标的时候使用了.createBitmap(mIconBitmap, 0, 0, mIconBitmap.getWidth(), mIconBitmap.getWidth(), matrix,true);但是就会报出异常,导致launcher不停的重启,问题还挺严重的,后来查看资料的时候说最好是使用Bitmap.createScaledBitmap(mIconBitmap, width, width, true)方法不容易出错,果然可以了;但是就觉得使用Matrix本身是没有问题的,最后在打log分析的时候发现问题主要是因为mIconBitmap.getWidth(), mIconBitmap.getWidth()得到的大小并不一样,所以导致缩放是有问题的
24、Canvas drawText(String, x, y, paint)
开始以为是以坐标x, y往下绘制,今儿才发现居然是从下往上绘制!
25、在Service或者BroadCastReceiver中使用AlertDialog是不能显示出来的,因为dialog必须依附于一个确定的Activity之上;为了解决该问题,我们可以将Dialg设置为系统的dialog;具体实现如下:
private void showConfirmDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.confirm_reset);
builder.setMessage(R.string.confirm_info);
builder.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.i("wrx439", "点击确定");
}
});
builder.setNegativeButton(R.string.confirm_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
另外这种做法还需要在AndroidManifest.xml文件中增加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
26、判断SD卡是否挂载
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
27、listview从下往上显示数据
android:stackFromBottom="true"
28、动态获取图片资源
1)通过Android提供的方法:Resources.getIdentifier():
function getResId(String name, Context context) {
Resources r = context.getResources();
int id = r.getIdentifier("icon", "drawable", "in.srain.cube.sample");
return id;
}
但是这种做法不值得推荐:引用了context,调用时间过长
2)通过反射获取
public static int getResId(String variableName, Class<?> c) {
try {
Field idField = c.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
使用方法:
getResId(name, R.drawable.class);
29)判断view是否可以下拉
public static boolean canChildScrollUp(View view) {
if (android.os.Build.VERSION.SDK_INT < 14) {
if (view instanceof AbsListView) {
final AbsListView absListView = (AbsListView) view;
return absListView.getChildCount() > 0
&& (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
.getTop() < absListView.getPaddingTop());
} else {
return view.getScrollY() > 0;
}
} else {
return view.canScrollVertically(-1);
}
}
30)ListView开始或者最后一行是否显示diviler
由两个属性决定的:
1)Android:headerDividersEnabled 或者 Android:footerDividersEnabled如果这俩个值为false,那么久不会显示;如果为true,还得满条件2:
2)listView的高度设置需要时match_parent,只有listview在判断当前最后一个item没有到达顶部的时候才会显示diviler;
31)inset标签的使用
有时绘制图片的时候左右两边不需要,那么久可以使用inset标签定义图片了,如下:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="10dp"
android:insetRight="10dp">
<shape android:shape="rectangle">
<size android:height="1px"/>
<solid android:color="@color/line"/>
</shape>
</inset>
32)判断应用程序权限是否开启
public boolean selfPermissionGranted(String permission) {
// For Android < Android M, self permissions are always granted.
boolean result = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int targetSdkVersion = info.applicationInfo.targetSdkVersion;
if (targetSdkVersion >= Build.VERSION_CODES.M) {
// targetSdkVersion >= Android M, we can
// use Context#checkSelfPermission
result = context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
} else {
// targetSdkVersion < Android M, we have to use PermissionChecker
result = PermissionChecker.checkSelfPermission(context, permission) == PermissionChecker.PERMISSION_GRANTED;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
return result;
}
33)
是布局透到状态栏上面去
if (Build.VERSION.SDK_INT >= 19) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
34)TextWatcher
private void initOrderSn() {
mOrderSn.addTextChangedListener(new TextWatcher() {
/**
* @param s---改变之前的内容
* @param start---改变的位置
* @param count---内容减少字符个数
* @param after---内容增加的字符个数
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.i("wrx1758", "s = " + s);
Log.i("wrx1758", "count = " + count);
Log.i("wrx1758", "start = " + start);
Log.i("wrx1758", "after = " + after);
}
/**
* @param s---改变后的字符
* @param start---内容改变的开始的位置
* @param before---内容减少的字符个数
* @param count---内容增加的字符个数
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.i("wrx1757", "s = " + s);
Log.i("wrx1757", "count = " + count);
Log.i("wrx1757", "start = " + start);
Log.i("wrx1757", "before = " + before);
/*if (s == null || s.length() == 0) return;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (i != 3 && i != 8 && s.charAt(i) == ' ') {
continue;
} else {
sb.append(s.charAt(i));
if ((sb.length() == 4 || sb.length() == 9) && sb.charAt(sb.length() - 1) != ' ') {
sb.insert(sb.length() - 1, ' ');
}
}
}
if (!sb.toString().equals(s.toString())) {
int index = start + 1;
if (sb.charAt(start) == ' ') {
if (before == 0) {
index++;
} else {
index--;
}
} else {
if (before == 1) {
index--;
}
}
mOrderSn.setText(sb.toString());
mOrderSn.setSelection(index);
}*/
}
@Override
public void afterTextChanged(Editable s) {
}
});
}