android中的小知识点——不断更新

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中的小知识点——不断更新)