Android4.0及其以上固件通过js修改webview内容后渲染问题

Android4.0及其以上固件通过js修改webview内容后渲染会有问题,显示不了,html是已经改变了,但是没有redraw。

上次写了篇文章说只要加个延时,这样可以部分解决问题。但是后续还是会有一些地方有同样的问题。

今天就死了心一定吧这问题搞定,在stackoverflow上找了很久,类似问题不多,只看到3 4个也遇到同样问题的,但是几乎没有找到合适的解决方案。

最后一个很好的解决办法,至于性能暂且不考虑

// webView及时刷新
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
appView.postInvalidate();
}
}, 300, 300);

这里用了定时,最好是吧他放在webview内容改变后触发的是事件上,由于时间精力原因就暂时不来找了。

PhoneGap一个神奇的问题backbutton没效果,尤其1.6以后的版本

PhoneGap一个神奇的问题backbutton没效果,尤其1.6以后的版本

郁闷了我差不多一个下午时间才发现问题所在:

AndroidManifest.xml文件中使用

<uses-sdk        android:minSdkVersion=”4″        android:targetSdkVersion=”10″ />就没有问题

如果是
<uses-sdk android:minSdkVersion=”4″ /> 这样pg就不会触发你写的backbutton事件。

很神奇吧~原因未知

Android模拟器修改HOST方法

D:\Android\android-sdk>cd tools

D:\Android\android-sdk\tools>emulator -avd hello2.2 -partition-size 128

D:\Android\android-sdk\tools>Unknown savevm section type 95

D:\Android\android-sdk\tools>cd ../

D:\Android\android-sdk>cd platform-tools

D:\Android\android-sdk\platform-tools>adb root
adbd is already running as root

D:\Android\android-sdk\platform-tools>adb remount
remount succeeded

D:\Android\android-sdk\platform-tools>adb pull /system/etc/hosts
0 KB/s (25 bytes in 0.144s)

D:\Android\android-sdk\platform-tools>adb push hosts /system/etc/
1 KB/s (102 bytes in 0.073s)

注意:hosts文件最后需要至少空2行以上,否则最后一行不会起效

如果最后一步出来failed to copy ‘hosts’ to ‘/system/etc/hosts': Directory not empty

可以adb shell

#ls看看空间是不是满了

在项目上点右键 — run as — run configurations — Android Application — Target标签下的 Additional Emulator Command Line Options — 在下面填上“-partition-size 256”即可

或$emulator –avd youravdname –partition-size 128

Android2.1 和之后的版本 中的 drawable(hdpi,ldpi,mdpi) 的区别

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480×800),FWVGA (480×854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320×480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240×320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

 

android模拟器运行时候一些问题及处理方案

1.运行android模拟器sdl_app: emulator-arm.exe 的解决方法?
把你的杀毒软件和电脑卫士之类的关了,就可以运行了

2.Failed to install on device ‘emulator-5554′: timeout?

可能因为卡的原因导致启动超时,解决办法:eclipse -> window -> Preferences -> Android ->

DDMS -> ADB connection time out(ms).把这个时间设置的长一些,默认是5秒即5000ms,

我改成10秒就ok了。这样就不用每次重启模拟器了。具体时间设置根据实际环境需要



Android解析webview内容,提取手机号,并且出发发短信/电话操作

1.首先创建一个html文件

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<div id=”msgContent”>

+8613858973960管理办公室  2011-11-30<br/>

15868474170<br/>

地址:杭州市文三西路<br/>

某公司招聘,下一位该面试的女孩的英文名叫“Spring”。秘书欲借机卖弄一下自己的英文水平,喊道:Hi!那个叫“春”的,轮到你了!

</div>

<script>

window.onload=function(){

var msgContent = document.getElementById(‘msgContent’).innerHTML;

var reg =/0{0,1}(13[4-9]?|15[7-9]|15[0-2]|18[7-8]|147)[0-9]{8}/g;

var arr = msgContent.match(reg);

for(var i=0;i<arr.length;i++){

msgContent=msgContent.replace(arr[i],”<a href=javascript:; onclick=window._Phone.showPhoneDialog(‘”+arr[i]+”‘)>”+arr[i]+”</a>”);

}

document.getElementById(‘msgContent’).innerHTML=msgContent;

}

</script>

2.webView的activity中

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(this, “_Phone”);

然后定义一个showPhoneDialog的方法:

 public void showPhoneDialog(String phoneNum) {
        Log.i(TAG, "HTML返回的phoneNum:" + phoneNum);
        selPhoneNum = phoneNum;
        new AlertDialog.Builder(BrowserActivity.this).setTitle("选择操作")
                .setItems(R.array.phone_options, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                        case CALL_PHONE:
                            Uri uriTel = Uri.parse("tel:" + selPhoneNum);
                            Intent intentTel = new Intent(Intent.ACTION_CALL, uriTel);
                            startActivity(intentTel);
                            break;
                        case CALL_SMS:
                            Uri uriSMS = Uri.parse("smsto:" + selPhoneNum);
                            Intent intentSMS = new Intent(Intent.ACTION_SENDTO, uriSMS);
                            startActivity(intentSMS);
                            break;
                        }
                    }
                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss(); // 关闭alertDialog
                    }
                }).show();
    }

3.res/value中新增一个xml文件:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <string-array name="phone_options"> 
        <item>打电话</item> 
        <item>发短信</item>
    </string-array> 
</resources>

4.HTML中通过调用window._Phone.showPhoneDialog(‘”+arr[i]+”‘)就可以调用到java中的方法。

注意调用短信和电话的方法。

Android布局属性全面剖析

Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料,花费本人一个下午搞出来的,希望对其他人有用。

第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop    贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

第二类:属性值必须为id的引用名“@id/id-name
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 离某元素底边缘的距离
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离

android:hint 设置EditText为空时输入框内的提示信息。
android:gravity是对该view 内容的限定.比如一个button 上面的text.  你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity=”right”则button上面的文字靠右
android:layout_gravity用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity=”right”则button靠右
android:scaleType控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。
————————————————————————————————————————————————————-
android:id
为控件指定相应的ID
android:text
指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:gravity
指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身
android:layout_gravity
指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity=”right”则button靠右
android:textSize
指定控件当中字体的大小
android:background
指定该控件所使用的背景色,RGB命名法
android:width
指定控件的宽度
android:height
指定控件的高度
android:layout_width
指定Container组件的宽度
android:layout_height
指定Container组件的高度
android:layout_weight
View中很重要的属性,按比例划分空间
android:padding*
指定控件的内边距,也就是说控件当中的内容
android:sigleLine
如果设置为真的话,则控件的内容在同一行中进行显示
android:scaleType
是控制图片如何resized/moved来匹对ImageView的siz
android:layout_centerHrizontal
水平居中
android:layout_centerVertical
垂直居中
android:layout_centerInparent
相对于父元素完全居中
android:layout_alignParentBottom
贴紧父元素的下边缘
android:layout_alignParentLeft
贴紧父元素的左边缘
android:layout_alignParentRight
贴紧父元素的右边缘
android:layout_alignParentTop
贴紧父元素的上边缘
android:layout_alignWithParentIfMissing
如果对应的兄弟元素找不到的话就以父元素做参照物
android:layout_below
在某元素的下方
android:layout_above
在某元素的的上方
android:layout_toLeftOf
在某元素的左边
android:layout_toRightOf
在某元素的右边
android:layout_alignTop
本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft
本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom
本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight
本元素的右边缘和某元素的的右边缘对齐
android:layout_marginBottom
离某元素底边缘的距离
android:layout_marginLeft
离某元素左边缘的距离
android:layout_marginRight
离某元素右边缘的距离
android:layout_marginTop
离某元素上边缘的距离
android:paddingLeft
本元素内容离本元素右边缘的距离
android:paddingRight
本元素内容离本元素上边缘的距离
android:hint
设置EditText为空时输入框内的提示信息
android:LinearLayout
它确定了LinearLayout的方向,其值可以为vertical, 表示垂直布局horizontal, 表示水平布局

—————————————————————————————————————————————————–
android:interpolator
可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:
AccelerateDecelerateInterpolator        在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator        在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator        动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator        在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator        在动画的以均匀的速率改变
对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。

 

Properties中文乱码的解决方案

1.很简单,把properties文件进行native2ascii转成ascii编码

2.

Properties p = new Properties();

ByteArrayInputStream in = new ByteArrayInputStream(pageContent.getBytes(“UTF-8″));//pageContent是一个String

p.load(in);//in是一个InputStream流

//p.getProperty(“versionCode”);这样会乱码

//正确处理

new String(p.getProperty(“versionCode”).getBytes(Charset.forName(“ISO-8859-1″)), Charset  .forName(“UTF-8″));

如何进行Android单元测试

  1. Menifest.xml中加入:

    <application>中加入:

    <uses-library android:name=”android.test.runner” />

    <application>外面加入:

    <uses-permission android:name=”android.permission.RUN_INSTRUMENTATION” />

    <instrumentation android:name=”android.test.InstrumentationTestRunner” android:targetPackage=”name.feisky.android.test”

    android:label=”Test for my app”/>

  2. 编写单元测试代码:必须继承自AndroidTestCase类

    package name.feisky.android.test;

     

    import android.test.AndroidTestCase;

    import junit.framework.Assert;

     

    public class MyTest extends AndroidTestCase {

    private static final String Tag=”MyTest”;

     

    public void testSave() throws Throwable

    {

    int i=4+8;

    Assert.assertEquals(5,i);

    }

     

    public void testSomethingElse() throws Throwable {

    Assert.assertTrue(1 + 1 == 12);

    }

     

    }

  3. 执行测试

    IntelliJ中:

     

    eclipse中:右键 run as Android JUnit Test

    命令行工具:

    adb shell am instrument -w name.feisky.android.test/android.test.InstrumentationTestRunner

     

也可以新建一个测试项目进行测试

 

  1. NewProjectAndroidAndroid Test Project.

  1. 添加测试用例类

    添加新类,基类设置为android.test.ActivityInstrumentationTestCase2<HelloAndroid>

  2. 添加构造函数

    添加setUp()方法,这个方法在所有的测试之前进行变量和测试环境的初始化。

    @Override

    protected void setUp() throws Exception {

    super.setUp();

    mActivity = this.getActivity();

    mView = (TextView) mActivity.findViewById(com.example.helloandroid.R.id.textview);

    resourceString = mActivity.getString(com.example.helloandroid.R.string.hello);

    }

  3. 添加testPreconditions()方法,检查初始化环境,只执行一次

    public void testPreconditions() {

    assertNotNull(mView);

    }

  4. 添加单元测试

    public void testText() {

    assertEquals(resourceString,(String)mView.getText());

    }

  5. 测试 Run As… > Android JUnit Test

 

Android中Context简介

Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄。很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,Activity以及Service。

Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收intents。

下面介绍Context的一些get方法,通过这些get方法可以获取应用环境全局信息:

1.public abstract Context getApplicationContext ()

Return the context of the single, global Application object of the current process.

2.public abstract ApplicationInfo getApplicationInfo ()

Return the full application info for this context’s package.

3.public abstract ContentResolver getContentResolver ()

Return a ContentResolver instance for your application’s package.

4.public abstract PackageManager getPackageManager ()

Return PackageManager instance to find global package information.

5.public abstract String getPackageName ()

Return the name of this application’s package.

6.public abstract Resources getResources ()

Return a Resources instance for your application’s package.

7.public abstract SharedPreferences getSharedPreferences (String name, int mode)

Retrieve and hold the contents of the preferences file ‘name’, returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other’s edits as soon as they are made.

8.public final String getString (int resId)

Return a localized string from the application’s package’s default string table.

9.public abstract Object getSystemService (String name)

Return the handle to a system-level service by name. The class of the returned object varies by the requested name. Currently available names are:

 

还有很多有用的方法,具体不一一列举。详情请参考文档,反正Context很有用。