android中的小知识点——不断更新
来源:互联网 发布:淘宝美工要求 编辑:程序博客网 时间:2024/05/18 11:13
File src = new File(Environment.getExternalStorageDirectory()+"/emoji/img");File[] files = src.listFiles();LogUtil.info("file length:"+files.length);for (int i = 0; i < files.length; i++) {LogUtil.info("rename..."+i);File f = files[i];String name = f.getName();name = name.substring(0, name.indexOf("."));String hexString = Integer.toHexString(Integer.parseInt(name));File toFile = new File(src.getAbsolutePath()+"/emoji_"+hexString+".png");f.renameTo(toFile);}
1、得到android的资源图片的时候,例如你要随机得到一张图片,你可以将这些图片的id放在一个集合中,但是如果图片太多了,这样还是很麻烦的,我们可以通过反射R文件中的资源id即可:
public void onClick_RandomFace(View view){ // 随机产生1至9的整数 int randomId = 1 + new Random().nextInt(9); try { // 根据随机产生的1至9的整数从R.drawable类中获得相应资源ID(静态变量)的Field对象 Field field = R.drawable.class.getDeclaredField("face" + randomId); // 获得资源ID的值,也就是静态变量的值 int resourceId = Integer.parseInt(field.get(null).toString()); // 根据资源ID获得资源图像的Bitmap对象 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId); // 根据Bitmap对象创建ImageSpan对象 ImageSpan imageSpan = new ImageSpan(this, bitmap); // 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像 SpannableString spannableString = new SpannableString("face"); // 用ImageSpan对象替换face spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将随机获得的图像追加到EditText控件的最后 edittext.append(spannableString); } catch (Exception e) { }}
在该方法 中随机获得了face1.png至face9.png中任意一个图像资源的ID。最常用的方法是将这9个图像资源ID放到数组中,然后随机产生一个数组索 引来获取相应的图像资源ID
2、第二种通过字符串获取到资源ID的方法:
int resId = getResources().getIdentifier(getItem(position), "drawable", getPackageName());传递的参数分别是:字符串,目录,包名
3、ListVIew的item中嵌套GridView,GridView显示不全的解决办法:
在自定义的GridView中加入以下代码即可:
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
4、ListVIew的GetChildAt方法获取为null的解决方法:
由于listview.getChildAt(lastPosition)针对的只是当前显示那个View来说的,listview上下拖动时总是会刷新下view载入新数据,清楚当前不显示的数据,不然的话当listview数据量过大时如果同时载入过量的数据,那么后果可想而知
解决方法:用得到的position减去第一个可见的item的位置即可
int po = position - listview.getFirstVisiblePosition();View mView = listview.getChildAt(po);
5、R文件不见了,根本解决方案
首先确定你的SDK是新的。
其次接下来检查你的.xml文件,文件名不能大写。
如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示。
Console会提示你xml文件错误在哪里
修改完xml文件之后
clean你的项目,再build你的项目
R.java会重新出现或更新
6、问题:android BitmapFactory.decodeStream,解析返回的Bitmap为null
出现原因:经上网查阅资料得知,这个android 的一个bug 。在android 2.2 以下(包括2.2) 用 BitmapFactory.decodeStream() 这个方法,会出现概率性的解析失败的异常。
解决办法:
一、如果从网络获取到的InputStream,将其装换为Byte
//定义一个根据图片url获取InputStream的方法 public static byte[] getBytes(InputStream is) throws IOException { ByteArrayOutputStream outstream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; // 用数据装 int len = -1; while ((len = is.read(buffer)) != -1) { outstream.write(buffer, 0, len); } outstream.close(); // 关闭流一定要记得。 return outstream.toByteArray(); }//然后使用方法decodeByteArray()方法解析编码,生成Bitmap对象。 byte[] data = getBytesFromInputStream(new URL(imgUrl).openStream()); Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
二、如果是本地的File,换一个解析方法即可
BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
6、设置自定义的title
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);setContentView(R.layout.main);getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
R.layout.title中就可以自定义布局了(上述顺序不可颠倒)
6、使用系统的AsycnTask异步加载图片时
抛出java.util.concurrent.RejectedExecutionException异常的原因及解决方案:
http://www.gsdtarena.com/a/Androidjc/327.html
7、android oncreate中获取控件的宽和高
当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下(此代码在OnCreate回调函数中验证通过,实时上,因为它是监听器,所以发生事件时已经和OnCreate无关了):
layout = (MetroLayout) findViewById(R.id.layout); ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { if (hasMeasured == false) { int height = metroLayout.getMeasuredHeight(); int width = metroLayout.getMeasuredWidth();//获取到宽度和高度后,可用于计算 hasMeasured = true; } return true; } });
7、对于android 关于Android下各个布局方式里面LayoutParams的用法
http://blog.sina.com.cn/s/blog_a2a3823601010hal.html
设置控件的margin的距离
得到LayoutParams,用里面的setMargins(10, 20, 30, 40);即可
8、跑程序的时候遇到了以下异常,报错并不是很好找:
android.content.res.Resources$NotFoundException: String resource ID #0x0
后来发现,原来是在设置
holder.watchNum.setText(record.getLookNum());
record.getLookNum()返回的是Int类型的,直接将它设置成String出错了,只要在设置之前转换成String即可!
9、对于EditText弹出软键盘,被挤压上去,关闭软键盘不下来解决方案
要实现个需求,有个edittext,点击输入法上的向下箭头,收起输入法的时候,dismiss edittext。很简单的需求,android居然没提供监听输入法收起的接口!只能通过间接的方式,原理是,给activity加上android:windowSoftInputMode="adjustResize",自定义Layout作为最外层的Layout,键盘收起的时候会调用自定义Layout的onSizeChange等方法,这个时候相当于监听到输入法收起的事件...还有个条件,activity不能设全屏!
it really sucks!
不是第一次遇到这种让人开发起来很难过的地方了。还有几个顺便提一下,很经典的4.0系统上无法监听home键,曾让多少码农伤神。
系统的有序和无需广播并且可以设置优先级导致一票的公司设置receiver的优先级来抢系统的来电广播,也不好说是系统设计鸡肋还是开发公司无下限了,居然还有setPriority(Integer.MAX_VALUE)的。只有SDK文档里面的一句"Applications must use a value that is larger than SYSTEM_LOW_PRIORITY and smaller than SYSTEM_HIGH_PRIORITY",光说没限制有什么用,靠自觉?
Fragment的推出在理念上确实能让开发灵活不少,能让开发者在适应多如牛毛的机器类型时稍微舒服点。但是如果现在就在开发中加入Fragment的话,你会发现工作量不但没减少,反而增加了。你需要为3.0以下的和3.0以上的机器重新写一套程序,好嘛,不仅是布局写两套,连代码也是两套!这个说来又是版本分裂的问题,官方一年出个大版本,新特性的兼容性基本没有。
http://blog.csdn.net/chang_xing/article/details/8105775
10、android下获取状态栏高度
/** * * @param activity * @return > 0 success; <= 0 fail */ public static int getStatusHeight(Activity activity){ int statusHeight = 0; Rect localRect = new Rect(); activity.getWindow().getDecorView( ).getWindowVisibleDisplayFrame(localRect); statusHeight = localRect.top; if (0 == statusHeight){ Class<?> localClass; try { localClass = Class.forName( "com.android.internal.R$dimen"); Object localObject = localClass.newInstance(); int i5 = Integer.parseInt( localClass.getField("status_bar_height").get( localObject).toString()); statusHeight = activity.getResources( ).getDimensionPixelSize(i5); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } return statusHeight; }
11、ImageButton在xml中设置android:focusable="false"和android:focusableInTouchMode="false",还是会抢ListView的焦点,原因是在xml中存在这样的bug,必须要在代码中设置ImageButton.setFocusable(false)才会生效
12、android EditText多行光标位置
EditText 多行文本光标如何移动到第一个字符,和最后一个字符呢。
1.光标如何移动到第一个字符前面
EditText et = new EditText(); et.requestFocus();et.setText("很多很多的文字很多很多的文字很多很多的文字很多很多的文字");
1.光标如何移动到最后一个字符后面
EditText et = new EditText(); et.setText("很多很多的文字很多很多的文字很多很多的文字很多很多的文字");et.requestFocus();
上面方法可能不太好用:下面的方法可以试一试
EditText et = new EditText(); et.setText("很多很多的文字很多很多的文字很多很多的文字很多很多的文字");et.setSelection(et.getText().length());
13、通知媒体库一个新文件产生了
MediaScannerConnection.scanFile( getApplicationContext(), new String[] { filepath }, null, null );
14、指定扫描文件:从本软件新增、修改、删除图片、文件某一个文件(音频、视频)需要更新系统媒体库时使用,不必扫描整个SD卡。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
15、使用TransitionDrawable实现渐变效果 ,比使用AlphaAnimation效果要好,可避免出现闪烁问题。
TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[] { defaultImageDrawable, new BitmapDrawable(MeetApplication.getContext().getResources(), bitmap) });transitionDrawable.setCrossFadeEnabled(true);iv_content_image.setImageDrawable(transitionDrawable);transitionDrawable.startTransition(100);
16、android 中 浏览器调用本地app应用
http://blog.csdn.net/geekpark/article/details/16118457
tips:pathPrefix最好不要加,判断应用唯一标示的主要是scheme
17、文件更名
java 的 File rename方法
18、混淆时gson出问题的解决方案
在混淆的时候就碰到了点问题,遇到嵌套的json数据无法成功转换成正确的对象
正确的解决方案(官网上提供了):http://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg
- android中的小知识点——不断更新
- 遇到的小知识点(不断更新)
- Androdi控件小知识点(不断更新)
- numpy中的知识点 (不断更新~)
- Android中的一些小知识点
- Android知识点清单(不断更新)
- Android琐碎知识点,不断更新中
- Android常用知识点汇总(不断更新)
- Android常用知识点汇总(不断更新)
- Android小知识点—ProgressBar、SharedPreferences
- Android开发过程中的几个小知识点
- Android Studio中的Gradle相关小知识点
- Android UE 设计规范—不断更新
- android 小技巧,不断更新中
- 知识点(不断更新)
- 数据库—小知识点
- 一个小的知识点——Flex中的文本换行
- 学习中的扩展知识——不断更新
- 环境配置
- Android网络编程之Http通信
- 【游戏引擎】深入分析Cocos2d-x 2.0中的“纹理”(二)
- jquery 实现checkbox的全选 全不选 反选
- NS2开发模块和tcl调试
- android中的小知识点——不断更新
- MapXtreme轨迹回放
- JTA
- Linux管道的实现机制
- 能耗监测系统(3)-DDSF866电表
- linux清理swap和buffer cache
- C++内存分析(二)
- winform 实现打印功能
- vim中文编码问题