当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于SDK上载的        关于SDK下载的 关于SDK下载的。 我用从官网上下载的android-sdk-windows来下载SDK,不知道为什么老是失败。 一开始看是因为有一个在Setting中有个"Force https://... sources to be fetched using http://"的要打.........
    ▪ Livefolder 以桥的模式存在        Livefolder 以桥的形式存在 Livefolder   [功能] 之所以说"桥" 是因为:   Livefolder 功能并没有开始就具备 而是后期加上去的 这就有了一个问题:早期的ContentProvider 里面的方法 query() 并没有提供对.........
    ▪ 胡说八道之LWUIT的UI组件代码结构浅析       胡言乱语之LWUIT的UI组件代码结构浅析 转:http://www.dongmian.org/2010/02/01/胡言乱语之lwuit的ui组件代码结构浅析/   LWUIT: https://lwuit.dev.java.net/ LWUIT是一个轻量级JavaME UI工具包。主要的特性包括.........

[1]关于SDK上载的
    来源: 互联网  发布时间: 2014-02-18
关于SDK下载的

关于SDK下载的。

我用从官网上下载的android-sdk-windows来下载SDK,不知道为什么老是失败。

一开始看是因为有一个在Setting中有个"Force https://... sources to be fetched using http://"的要打上勾,意思是用https失败后强制用http连结。。大概是这个意思吧。

可还是下不了。

要不是一直都是Downloading XXXX。。。不动。。。

要不老是说什么Download Failed

意思是下载大小有问题

 

最后没办法啦。

 

所以直接用浏览器打开那个XML


https://dl-ssl.google.com/android/repository/repository.xml

 

里边就能找到所有的想要的东西。

在<sdk:archive os="windows">标签的下边
有个<sdk:url>usb_driver_r03-windows.zip</sdk:url>
总之把这个sdk:url标签之内的名称复制下来,然后放到前边的链接下。
如:
https://dl-ssl.google.com/android/repository/usb_driver_r03-windows.zip

这样子驱动就下下来了,

然后将下下来的文件放到刚刚最早下载的SDK的temp目录下,然后再在程序里选择USB Driver,安装。。。搞定!

 

这样子所有的SDK就能下载了。同理吗。。。

 

Google Map API 也是,

不过在安装的时候要先安装SDK,才能安装相应version的GoogleMapAPI。

 


    
[2] Livefolder 以桥的模式存在
    来源: 互联网  发布时间: 2014-02-18
Livefolder 以桥的形式存在

Livefolder

 

[功能]

之所以说"桥" 是因为:

 

Livefolder 功能并没有开始就具备 而是后期加上去的 这就有了一个问题:早期的ContentProvider 里面的方法 query() 并没有提供对 Livefolder 的支持 而 Livefolder 的query() 是要含有指导列明的 这二者不可协调 要么改动ContentProvider  要么不用Livefolder 为了解决这个问题 我想想出了一个办法

 

 

 1. 现有一个比较早的ContentProvider :CProviderMin 其action 为:

写道
<provider android:name="CProviderMin"
android:authorities="com.andriod.providers.countrycode" />

 

 

 

2. 现在想开发对CProviderMin 的Livefolder 但是又不想改动CProviderMin 的代码  于是我新加了一个ContentProvider: LivefolderProvider 其action 为:

写道
<provider android:name="LivefolderProvider"
android:authorities="com.andriod.providers.LivefolderProvider.countrycode" />

 

 

关键是:实现 LivefolderProvider  的 query()  要求:

写道
1. 通过 ContentResolver 来访问目标ContentProvider:CProviderMin 并含有 Livefolder 所需的指定列明

2. 把 上面的 query() 结果返回

 

 

其query() 实现如下:

public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		
        String[] myProjection = {
        		CHelper.SQLiteColumn.ID + " AS " + LiveFolders._ID,
        		CHelper.SQLiteColumn.COUNTRY + " AS " + LiveFolders.NAME,
        		CHelper.SQLiteColumn.CODE + " AS " + LiveFolders.DESCRIPTION
        };

        ContentResolver resolver = this.getContext().getContentResolver();
        
        Uri u2 = Uri.parse("content://"+"com.andriod.providers.countrycode"+"/item");
		
        Cursor c = resolver.query(u2, myProjection, null, null, null);
        return c;
	}

 

 

 

3. 准备 "android.intent.action.CREATE_LIVE_FOLDER" 的 Activity  如下:

public class CreateLivefolder extends Activity {
	public static final Uri LIVE_FOLDER_URI = 
        Uri.parse("content://" + "com.andriod.providers.countrycode" + "/livefolder");
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        if (getIntent().getAction()
                .equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {
            
            Intent intent = new Intent();

            intent.setData(LIVE_FOLDER_URI);
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,
                    "CountryLivefolder");
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
                    Intent.ShortcutIconResource.fromContext(this,
                            R.drawable.icon));
            intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, 
                    LiveFolders.DISPLAY_MODE_LIST);
            
            setResult(RESULT_OK, intent);
        } else {
            setResult(RESULT_CANCELED);
        }
        finish();
    }
}

 

关键是: 把其所使用的 ContentProvider 通过 setData() 指向 LivefolderProvider 即可

 

 

 

4. emulator 运行截图:略 因为要睡觉了

 * ContentResolver 截图:

 

* Livefolder 截图:

 

 

之所以写这篇blog 是因为在一个论坛提过这个弊端 所以尝试一把 因为这仅仅是把自己想法实现一些 而且也不知道有没有用 所以说得不是太详细 有需求的朋友 请回复一下 我再细说.

 

 

题外话: 因为这个想法很有"桥"的感觉 所以以这个命名!


    
[3] 胡说八道之LWUIT的UI组件代码结构浅析
    来源: 互联网  发布时间: 2014-02-18
胡言乱语之LWUIT的UI组件代码结构浅析

转:http://www.dongmian.org/2010/02/01/胡言乱语之lwuit的ui组件代码结构浅析/

 

LWUIT: https://lwuit.dev.java.net/ LWUIT是一个轻量级JavaME UI工具包。主要的特性包括:类似Swing 的MVC架构,支持多种布局(Layouts),皮肤更换,字体,触摸屏,动画效果,Rich控件,3D集成,Painter,模式对画 框,I18N/L10N等。值得一提的是LWUIT是sun公司主推的一个图形库,在wtk3.0中已经算是内置的库了。

LWUIT中的组件都在com.sun.lwuit这个包下,所有的组件都是要继承Component这个类,这里Component使用了composite 的设计模式。

为了更形象得了解LWUIT的组件体系。可以看下面的UI组件的关系图。

图一:Component的继承关系

从图一可以看出,Component分为五大类,分别是

1、Container

2、Label

3、List

4、MediaComponent

5、TextArea

Container与其它的四类组件的不同在于它可以存放子节点,其代码可以下面的方法

Container对子组件操作的方法


void  addComponent (Object constraints, Component cmp)
void  addComponent (int index, Object constraints, Component cmp)
void  addComponent (int index, Component cmp)
void  replaceAndWait (final Component current, final Component next, final Transition t)
void  replace (final Component current, final Component next, final Transition t)
void  removeComponent (Component cmp)
void  flushReplace ()
void  removeAll ()

那么每个组件的paint方法又在做什么了?

首先看Container这个类,Container的意思是容器,它的paint方法是对它所包含的每个Componet都有去调paintInternal方法。代码如下:

 component的paint方法 

    public void paint(Graphics g) {
        layoutContainer();
        g.translate(getX(), getY());
        int size = components.size();
        for (int i = 0; i < size; i++) {
            Component cmp = (Component)components.elementAt(i);
            cmp.paintInternal(g, false);
        }
        g.translate(-getX(), -getY());
    } 

paintInternal方法中有分有scrollbar和没有scrollbar两种,代码如下:

 component的paintInternal方法 

     final void paintInternal(Graphics g, boolean paintIntersects) {
        if (!isVisible()) {
            return;
        }
        int oX = g.getClipX();
        int oY = g.getClipY();
        int oWidth = g.getClipWidth();
        int oHeight = g.getClipHeight();
        if (bounds.intersects(oX, oY, oWidth, oHeight)) {
            g.clipRect(getX(), getY(), getWidth(), getHeight());
            paintBackground(g);
            //是否绘制scrollbar
            if (isScrollable()) {
                int scrollX = getScrollX();
                int scrollY = getScrollY();
                g.translate(-scrollX, -scrollY);
                //注意paint函数的调用 

                  paint(g);
                g.translate(scrollX, scrollY);
                if (isScrollVisible) {
                    paintScrollbars(g);
                }
            } else {
                paint(g);
            }
            if (isBorderPainted()) {
                paintBorder(g);
            }

            //paint all the intersecting Components above the Component
            if (paintIntersects && parent != null) {
                paintIntersectingComponentsAbove(g);
            }

            g.setClip(oX, oY, oWidth, oHeight);
        }
    }

这里要注意的paint的方法,根据多态性,它会去调用各个Component的真正方法.

Container下的子类都会去调用Compaint的paint方法,而Label的子类,除了Spinner外,paint方法都会去调用类似下面的方法

 Label子类的paint方法 

 UIManager.getInstance().getLookAndFeel().drawXXXX(g); 

这里面的drawXXXX代表是对应的组件名,比如说CheckBox,那它调用方法就是

 CheckBox的paint方法

 UIManager.getInstance().getLookAndFeel().drawCheckBox(g, this); 

RadioButton的调用就为

 CheckBox的paint方法 UIManager.getInstance().getLookAndFeel().drawRadioButton(g, this); 

从这的代码就引出了UIManager这个类,UIManager这个类的作用是为了移植而进行的封装的,使用单例模式,

在UIManager这个类中要注意的方法有两个:

 UIManager的关键方法   /**

     * Returns the currently installed look and feel
     *
     * @return the currently installed look and feel
     */
    public LookAndFeel getLookAndFeel(){
        return current;
    }

    /**
     * Sets the currently installed look and feel
     *
     * @param plaf the look and feel for the application
     */
    public void setLookAndFeel(LookAndFeel plaf){
        current.uninstall();
        current = plaf;
    }

这两个方法就是对组件Render的关键,如果我们想自己实现一套组件的表现,那么我们只要实现一个LookAndFeel的子类,然后对通过setLookAndFeel把它传给UIManager,这种做法也是高度封装的。

在UIManager中,默认的LookAndFeel是DefaultLookAndFeel这个类,这也是组件默认的表现方法。

通过上面的分析,这里使用了单例的设计模式和proxy的设计模式,具体流程为:

1、UIManager在程序初始化之前会根据不同的平台去调用不同的LookAndFeel的实例,而各个平台的LookAndFeel类里面实现各种UI组件的绘制方法。这时使用proxy设计模式。2、各种UI组件只要去调UIManager的对应的draw方法就可以了,这时使用的是单例的设计模式。

也就是下图

如果一个软件为了可移植性,那么可以参考一下这种实现方法,当然可移植性还有很多方式来实现,如果有更好的方式欢迎发邮件议论,我的邮箱是:

附:从SVN中直接签出的LWUIT代码是适合netbeans的,但是如果使用Eclipse打开LWUIT的代码会出如下错误提示:

The method  方法名 is defined in an inherited type and an enclosing scope

这时只要在出错的代码前加一个“this.”就可以了。例如Form.java中的MenuBar()构造函数中

setLayout(new GridLayout(1, 3));


就会报“defined in an inherited type and an enclosing scope” 异常,只要把代码改成如下就不会报错了。红色部分是后面要添加的

 

this.setLayout(new GridLayout(1, 3));

一些名词定义

Singleton pattern(单例模式): http://en.wikipedia.org/wiki/Singleton_pattern

Composite pattern: http://en.wikipedia.org/wiki/Composite_pattern

Proxy pattern(代理模式): http://en.wikipedia.org/wiki/Proxy_pattern

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android显式启动与隐式启动Activity的区别介绍 iis7站长之家
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3