2013年9月21日星期六

Android在OnCreate中获取控件的宽度和高度

在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要。另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高度。


可惜的是,根据我的验证,利用网上转载的那些方法在OnCreate函数中获取到的仍然是0(希望搞技术的能自己验证过再转载),例如Measure方法之后调用getMeasuredWidth的值还是0。


原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下(此代码在OnCreate回调函数中验证通过,实时上,因为它是监听器,所以发生事件时已经和OnCreate无关了):


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

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; } });






原文作者: 皇马船长
原文地址: http://my.eoe.cn/cainiao1/archive/14760.html

2013年6月5日星期三

GPX

GPX


GPXGPS eXchange Format, GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式。
它可以用来描述路点、轨迹、路程。这个格式是免费的,可以在不需要付任何许可费用的前提下使用。它的标签保存位置,海拔和时间,可以用来在不同的GPS设备和软件之间交换数据。如查看轨迹、在照片的exif数据中嵌入地理数据。


数据类型

在GPX中,一个没有顺序关系的点集合,叫路点。一个有顺序的点的集合叫轨迹或者路程。轨迹是一个人曾经走过的记录,路程是一个建议的下一步要走的地方。所以,一般来讲,轨迹里的点,包含时间信息,路程里的点,没有时间信息。
最小的一个GPX文件,仅仅包含一个经纬度坐标的点,其它的都是可选的。

示例 

下面这个GPX文件(局部)是由Garmin Oregon 400t手持GPS设备产生,这个文件展示了GPX格式的功能。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2009-10-17T22:58:43Z</time>
  </metadata>
  <trk>
    <name>Example GPX Document</name>
    <trkseg>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.46</ele>
        <time>2009-10-17T18:37:26Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.94</ele>
        <time>2009-10-17T18:37:31Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>6.87</ele>
        <time>2009-10-17T18:37:34Z</time>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

参见

参考 

2013年5月27日星期一

SimpleCursorAdapter 貌似很好用的样子


new ImageAdapter(MainActivity.this, R.layout.griditem, getImageCursor(),new String[] {}, new int[] {});   


class ViewHolder {
        ImageView testimg;
    }  

class ImageAdapter extends SimpleCursorAdapter {

        public ImageAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
        }

        @Override
        public void changeCursor(Cursor c) {
            super.changeCursor(c);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View v = super.newView(context, cursor, parent);

            ViewHolder vh = new ViewHolder();
            vh.testimg = (ImageView) v.findViewById(R.id.test);
            v.setTag(vh);
            return v;

        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ViewHolder vh = (ViewHolder) view.getTag();
            int imageid = cursor.getInt(0);
            Bitmap temBitmap = MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(), imageid,
                    MediaStore.Images.Thumbnails.MINI_KIND, null);
            vh.testimg.setImageBitmap(temBitmap);

        }

    }

2013年4月17日星期三

接入微博weibo.sdk.android.sso.jar后功能正常,混淆打包过后调用崩溃的解决方案。

混淆后具体的报错日志如下

W/System.err(30242): java.io.FileNotFoundException: weibosdk_dialog_bg.9.png
W/System.err(30242):  at android.content.res.AssetManager.openAsset(Native Method)
W/System.err(30242):  at android.content.res.AssetManager.open(AssetManager.java:337)
W/System.err(30242):  at android.content.res.AssetManager.open(AssetManager.java:311)
W/System.err(30242):  at com.weibo.sdk.android.WeiboDialog.setUpWebView(WeiboDialog.java:128)
W/System.err(30242):  at com.weibo.sdk.android.WeiboDialog.onCreate(WeiboDialog.java:88)
W/System.err(30242):  at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
W/System.err(30242):  at android.app.Dialog.show(Dialog.java:225)
W/System.err(30242):  at com.weibo.sdk.android.Weibo.startDialog(Weibo.java:129)
W/System.err(30242):  at com.weibo.sdk.android.Weibo.startAuthDialog(Weibo.java:71)
W/System.err(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:122)
W/System.err(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:106)

W/System.err(30242):  at android.view.View.performClick(View.java:2486)
W/System.err(30242):  at android.view.View$PerformClick.run(View.java:9130)
W/System.err(30242):  at android.os.Handler.handleCallback(Handler.java:587)
W/System.err(30242):  at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(30242):  at android.os.Looper.loop(Looper.java:130)
W/System.err(30242):  at android.app.ActivityThread.main(ActivityThread.java:3703)
W/System.err(30242):  at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(30242):  at java.lang.reflect.Method.invoke(Method.java:507)
W/System.err(30242):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
W/System.err(30242):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
W/System.err(30242):  at dalvik.system.NativeStart.main(Native Method)
/System.err(30242): java.io.FileNotFoundException: values/dimens.xml
W/System.err(30242):  at android.content.res.AssetManager.openAsset(Native Method)
W/System.err(30242):  at android.content.res.AssetManager.open(AssetManager.java:337)
W/System.err(30242):  at android.content.res.AssetManager.open(AssetManager.java:311)
W/System.err(30242):  at com.weibo.sdk.android.WeiboDialog.parseDimens(WeiboDialog.java:260)
W/System.err(30242):  at com.weibo.sdk.android.WeiboDialog.setUpWebView(WeiboDialog.java:163)
W/System.err(30242):  at com.weibo.sdk.android.WeiboDialog.onCreate(WeiboDialog.java:88)
W/System.err(30242):  at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
W/System.err(30242):  at android.app.Dialog.show(Dialog.java:225)
W/System.err(30242):  at com.weibo.sdk.android.Weibo.startDialog(Weibo.java:129)
W/System.err(30242):  at com.weibo.sdk.android.Weibo.startAuthDialog(Weibo.java:71)
W/System.err(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:122)
W/System.err(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:106)

W/System.err(30242):  at android.view.View.performClick(View.java:2486)
W/System.err(30242):  at android.view.View$PerformClick.run(View.java:9130)
W/System.err(30242):  at android.os.Handler.handleCallback(Handler.java:587)
W/System.err(30242):  at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(30242):  at android.os.Looper.loop(Looper.java:130)
W/System.err(30242):  at android.app.ActivityThread.main(ActivityThread.java:3703)
W/System.err(30242):  at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(30242):  at java.lang.reflect.Method.invoke(Method.java:507)
W/System.err(30242):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
W/System.err(30242):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
W/System.err(30242):  at dalvik.system.NativeStart.main(Native Method)
D/AndroidRuntime(30242): Shutting down VM
W/dalvikvm(30242): threadid=1: thread exiting with uncaught exception (group=0x40015568)
E/AndroidRuntime(30242): FATAL EXCEPTION: main
E/AndroidRuntime(30242): android.content.res.Resources$NotFoundException: Resource ID #0x7f040000 type #0x3 is not valid
E/AndroidRuntime(30242):  at android.content.res.Resources.getDimensionPixelSize(Resources.java:531)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.WeiboDialog.setUpWebView(WeiboDialog.java:171)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.WeiboDialog.onCreate(WeiboDialog.java:88)
E/AndroidRuntime(30242):  at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
E/AndroidRuntime(30242):  at android.app.Dialog.show(Dialog.java:225)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.Weibo.startDialog(Weibo.java:129)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.Weibo.startAuthDialog(Weibo.java:71)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:122)
E/AndroidRuntime(30242):  at com.weibo.sdk.android.sso.SsoHandler.authorize(SsoHandler.java:106)

E/AndroidRuntime(30242):  at android.view.View.performClick(View.java:2486)
E/AndroidRuntime(30242):  at android.view.View$PerformClick.run(View.java:9130)
E/AndroidRuntime(30242):  at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(30242):  at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(30242):  at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(30242):  at android.app.ActivityThread.main(ActivityThread.java:3703)
E/AndroidRuntime(30242):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(30242):  at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(30242):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime(30242):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
E/AndroidRuntime(30242):  at dalvik.system.NativeStart.main(Native Method)

先开始想了很多,尝试了很多方法去解决。比如想是不是混淆除了什么问题。昨天弄了一天都没弄好。
今天又开始仔细看这个报错日志,然后在官方的Demo中找到sdk源码,定位到报错的这两句。于是尝试把Demo中assets中的资源拷贝到我的项目的assets文件夹中,混淆打包过后,调用正常了,哈哈哈。

昨天查了N的资料和用三种方式联系了官方技术支持都无果,最后还是要靠自己啊 :)