当前位置:  编程技术>移动开发
本页文章导读:
    ▪ContentProvider-3最容易的        ContentProvider-3最简单的 看完Google的文档,我终于自己写出了一个简单的ContentProvider,并且写了另一个工程去使用它,现总结如下:一、创建一个ContentProvider必备:1.      Set up a system for .........
    ▪ 玩转Andorid-UI篇-TableLayout(报表布局)        玩转Andorid---UI篇---TableLayout(表格布局) TableLayout是一个以行、列显示视图View的视图组   1、开始一个新的工程,名字叫做HelloTableLayout   2、打开res/layout/main.xml文件并且插入如下内容 <?xml v.........
    ▪ JIL Mobile Widget 初始认识       JIL Mobile Widget 初步认识    上星期去参加html5专题讲座沙龙,学到了点比较好奇的东西,所以回来研究研究! 前言 手机平台的技术发展与趋势,「从本机(Native Application)走向云端(Cloud Computing).........

[1]ContentProvider-3最容易的
    来源: 互联网  发布时间: 2014-02-18
ContentProvider-3最简单的
看完Google的文档,我终于自己写出了一个简单的ContentProvider,并且写了另一个工程去使用它,现总结如下:
一、创建一个ContentProvider必备:
1.      Set up a system for storing the data,就是想好你用什么方式存储数据,你可以用任何你喜欢的方式存储,文件存储或SQLite数据库
2.      Extend the ContentProvider class to provide access to the data.
3.      Declare the content provider in the manifest file for your application (AndroidManifest.xml).就是写上类似这样的东西:
<provider android:name="LilyProvider" android:authorities="com.ianc.lilyprovider" />
 
二、写一个类继承自ContentProvider,并且使用一个继承自SQLiteOpenHelper的类去管理database以及table的创建。

三、将override所有的unimplemented方法,即:
      query() 
       insert() 
update() 
delete() 
getType() 
onCreate()
四、需要写一个供使用者使用的类,这个类中必须公布给使用者用的CONTENT_URI,以及各个表的column名,并且最好用注释写好每个column的类型,以方便Provider的用户使用。例如我就写了一个类:
public class LilyUser {
public static class User{
public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");
}
public static class UserColumns implements BaseColumns{
public static String NAME = "name";
public static String PASSWORD = "password";
}
}这里面我就将整个类看成是一个database,然后里面User算成是一张表(其实表名是customer,这里名字还是没有命名好,应该一致的),而UserColumn则是这张表的所有column。这样的结构比较清晰易读。
五、在创建table的时候_ID很重要,文档中很明确说明了这一点:
1.Be sure to include an integer column named "_id" (with the constant _ID) for the IDs of the records.
2.假如设置了INTEGER PRIMARY KEY AUTOINCREMENT这个属性,那么不论数据库的数据是否被删除过,系统的id将一直增长,而假如不加AUTOINCREMENT这个属性,那么删除掉一条数据后空出的id,将在下一次新增数据时使用,例如有数据1,2,3条,现在删去第2条,再插入一条,那么新增的这一条id是2,假如设置了AUTOINCREMENT,那么则是4。
六、最后我想到一个方式如何在使用ContentProvider 的query时候去实现多表查询了,我想只要自己定义好uri的格式,然后在Provider的query里面去解析传来的uri,只要满足特定条件,就代表是多表查询就ok,这个方法我会下次试试。
我写了两个工程一个是LilyProvider,这个就是我写的ContentProvider了,另一个是TestLilyProvider,就是使用我写的这个provider啦。
附上主要的代码:
LilyUser.java:供Provider的使用者使用的类


view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;  
2. import android.net.Uri;  
3. import android.provider.BaseColumns;  
4. public class LilyUser {  
5.       
6.     public static class User{  
7.         public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");  
8.     }  
9.     public static class UserColumns implements BaseColumns{   
10.         public static String NAME = "name";  
11.         public static String PASSWORD = "password";  
12.     }  
13. }  
 
LilyProvider.java:一个简单粗暴的ContentProvider


view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;  
2. import android.content.ContentProvider;  
3. import android.content.ContentValues;  
4. import android.content.Context;  
5. import android.content.UriMatcher;  
6. import android.database.Cursor;  
7. import android.database.sqlite.SQLiteDatabase;  
8. import android.database.sqlite.SQLiteOpenHelper;  
9. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
10. import android.net.Uri;  
11. import android.util.Log;  
12. public class LilyProvider extends ContentProvider {  
13.     final String TABLE_NAME = "customer";  
14.     private static final String  DATABASE_NAME = "lily.db";  
15.     private String AUTHORITY = "com.ianc.lilyprovider";  
16.     private static final int DATABASE_VERSION = 1;  
17.     DatabaseHelper mDbHelper;  
18.     static UriMatcher sUriMatcher;  
19.     static{  
20. //      sUriMatcher.addURI(AUTHORITY, path, code)  
21.     }  
22.     class DatabaseHelper extends SQLiteOpenHelper {  
23.         public DatabaseHelper(Context context) {  
24.             super(context, DATABASE_NAME, null, DATABASE_VERSION);  
25.         }  
26.         @Override  
27.         public void onCreate(SQLiteDatabase db) {  
28.             Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");  
29.             db.execSQL("Create table " + TABLE_NAME + "( " +  
30.                     LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
31.                     LilyUser.UserColumns._COUNT + " INTEGER,"+  
32.                     LilyUser.UserColumns.NAME + " TEXT," +  
33.                     LilyUser.UserColumns.PASSWORD +" TEXT" +  
34.                     ");");  
35.         }  
36.         @Override  
37.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
38.             Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");  
39.             db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");  
40.             onCreate(db);  
41.         }  
42.           
43.     }  
44.     @Override  
45.     public int delete(Uri arg0, String arg1, String[] arg2) {  
46.         Log.i("lily","LilyProvider-->delete");  
47.         SQLiteDatabase db = mDbHelper.getWritableDatabase();  
48.         int rownum = db.delete(TABLE_NAME, arg1, arg2);  
49.         return rownum;  
50.     }  
51.     @Override  
52.     public String getType(Uri uri) {  
53.         Log.i("lily","LilyProvider-->getType");  
54.         return null;  
55.     }  
56.     @Override  
57.     public Uri insert(Uri uri, ContentValues values) {  
58.         Log.i("lily","LilyProvider-->insert");  
59.         SQLiteDatabase db = mDbHelper.getWritableDatabase();  
60.         db.insert(TABLE_NAME, null, values);  
61.         return null;  
62.     }  
63.     @Override  
64.     public boolean onCreate() {  
65.         Log.i("lily","LilyProvider-->onCreate");  
66.         mDbHelper = new DatabaseHelper(this.getContext());  
67.         return false;  
68.     }  
69.     @Override  
70.     public Cursor query(Uri uri, String[] projection, String selection,  
71.             String[] selectionArgs, String sortOrder) {  
72.         Log.i("lily","LilyProvider-->query");  
73.         SQLiteDatabase db = mDbHelper.getReadableDatabase();  
74.         Cursor c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);  
75.         return c;  
76.     }  
77.     @Override  
78.     public int update(Uri uri, ContentValues values, String selection,  
79.             String[] selectionArgs) {  
80.         Log.i("lily","LilyProvider-->update");  
81.         SQLiteDatabase db = mDbHelper.getWritableDatabase();  
82.         int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);  
83.         return rownum;  
84.     }  
85. }  
 
TestLilyProvider.java:例举一个简单的使用方法


view plaincopy to clipboardprint?
1. package com.ianc.testlilyprovider;  
2. import com.ianc.lilyprovider.LilyUser;  
3. import android.app.Activity;  
4. import android.content.ContentUris;  
5. import android.content.ContentValues;  
6. import android.database.Cursor;  
7. import android.net.Uri;  
8. import android.os.Bundle;  
9. import android.util.Log;  
10. import android.view.View;  
11. import android.view.View.OnClickListener;  
12. import android.widget.Button;  
13. public class TestLilyProvider extends Activity implements OnClickListener {  
14.     Button mQueryBtn;  
15.     Button mInsertBtn;  
16.     Button mUpdateBtn;  
17.     Button mDeleteBtn;  
18.     /** Called when the activity is first created. */  
19.     @Override  
20.     public void onCreate(Bundle savedInstanceState) {  
21.         super.onCreate(savedInstanceState);  
22.         setContentView(R.layout.main);  
23.         mQueryBtn = (Button)findViewById(R.id.query);  
24.         mInsertBtn = (Button)findViewById(R.id.insert);  
25.         mUpdateBtn = (Button)findViewById(R.id.update);  
26.         mDeleteBtn = (Button)findViewById(R.id.delete);  
27.           
28.         mQueryBtn.setOnClickListener(this);  
29.         mInsertBtn.setOnClickListener(this);  
30.         mUpdateBtn.setOnClickListener(this);  
31.         mDeleteBtn.setOnClickListener(this);  
32.     }  
33.     @Override  
34.     public void onClick(View v) {  
35.         if (v == mQueryBtn){  
36.             query();  
37.         }  
38.         else if (v == mInsertBtn){  
39.             insert();  
40.         }  
41.         else if (v == mUpdateBtn){  
42.             update();  
43.         }  
44.         else if (v == mDeleteBtn){  
45.             delete();  
46.         }  
47.           
48.     }  
49.     private void query() {  
50.         String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};  
51.         String selection = null;  
52.         String [] selectionArgs = {"lily"};  
53.         String sortOrder = null;  
54.           
55.         Cursor cursor = getContentResolver().query(LilyUser.User.CONTENT_URI, projection, LilyUser.UserColumns.NAME +" = ?", selectionArgs, sortOrder);  
56.         if (cursor.moveToFirst()){  
57.             Log.i("lily","*********************************************");  
58.             String id;  
59.             String name;  
60.             String password;  
61.             do{  
62.                 id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));  
63.                 Log.i("lily","id = "+id);  
64.                   
65.                 name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));  
66.                 Log.i("lily","name = "+name);  
67.                   
68.                 password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));  
69.                 Log.i("lily","password = "+password);  
70.                   
71.                 Log.i("lily","*********************************************");  
72.             }while(cursor.moveToNext());  
73.         }  
74.         else{  
75.             Log.i("lily","no result");  
76.         }  
77.         cursor.close();  
78.     }  
79.       
80.     private void insert() {  
81.         ContentValues values = new ContentValues();  
82.         values.put(LilyUser.UserColumns.NAME, "lily");  
83.         values.put(LilyUser.UserColumns.PASSWORD, "19870528");  
84.         getContentResolver().insert(LilyUser.User.CONTENT_URI, values);  
85.     }  
86.       
87.     private void update() {  
88.         ContentValues values = new ContentValues();  
89.         values.put(LilyUser.UserColumns.NAME, "lily");  
90.         values.put(LilyUser.UserColumns.PASSWORD, "ljy19870528");  
91.         String[] selectionArgs = {"lily"};  
92.         int num = getContentResolver().update(LilyUser.User.CONTENT_URI, values, LilyUser.UserColumns.NAME +" = ?", selectionArgs);  
93.         Log.i("lily",num + " rows be updated");  
94.     }  
95.       
96.     private void delete() {  
97.         String[] selectionArgs = {"lily"};  
98.         int num = getContentResolver().delete(LilyUser.User.CONTENT_URI, LilyUser.UserColumns.NAME +" = ?", selectionArgs);  
99.         Log.i("lily",num+" rows be deleted");  
100.           
101.     }  
102. }  

    
[2] 玩转Andorid-UI篇-TableLayout(报表布局)
    来源: 互联网  发布时间: 2014-02-18
玩转Andorid---UI篇---TableLayout(表格布局)

TableLayout是一个以行、列显示视图View的视图组

 

1、开始一个新的工程,名字叫做HelloTableLayout

 

2、打开res/layout/main.xml文件并且插入如下内容

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:stretchColumns="1">
	<TableRow>
		<TextView
			android:layout_column="1"
			android:text="Open..."
			android:padding="3dip"
		/>
		<TextView
			android:text="Ctrl-O"
			android:gravity="right"
			android:padding="3dip"
		/>
	</TableRow>
	<TableRow>
		<TextView
			android:layout_column="1"
			android:text="Save..."
			android:padding="3dip"
		/>
		<TextView
			android:text="Ctrl-S"
			android:gravity="right"
			android:padding="3dip"
		/>
	</TableRow>
	<TableRow>
		<TextView
			android:layout_column="1"
			android:text="Save as..."
			android:padding="3dip"
		/>
		<TextView
			android:text="Ctrl-Shift-S"
			android:gravity="right"
			android:padding="3dip"
		/>
	</TableRow>
	<View
		android:layout_height="2dip"
		android:background="#FF909090"
	/>
	<TableRow>
		<TextView
			android:text="X"
			android:padding="3dip"
		/>
		<TextView
			android:text="Import..."
			android:padding="3dip"
		/>
	</TableRow>
	<TableRow>
		<TextView
			android:text="X"
			android:padding="3dip"
		/>
		<TextView
			android:text="Export..."
			android:padding="3dip"
		/>
		<TextView
			android:text="Ctrl-E"
			android:gravity="right"
			android:padding="3dip"
		/>
	</TableRow>
	<View
		android:layout_height="2dip"
		android:background="#FF909090"
	/>
	<TableRow>
		<TextView
			android:layout_column="1"
			android:text="Quit"
			android:padding="3dip"
		/>
	</TableRow>
</TableLayout>

 

注意到这个文件类似于HTML的table的结构,TableLayout元素就像是HTML中的<table>元素;TableRow就像是一一个<tr>元素;但是对于每一个单元格,你可以用各种视图元素,在这里例子里,每个单元格用TextView,在这些行之间,还有一个基本View,用来画水平线

TextView中的一些属性
android:layout_column="1":表示控件放在标号为1的列上,标号是从0开始的
android:gravity="right":定义字体在父控件中显示在右边
android:stretchColumns="1":设置自动拉伸哪些列,列ID从0开始,多个列的话用","分隔。这里的作用是让第2列可以扩展到所有可用空间
android:shrinkColumns:设置自动收缩哪些列,列ID从0开始,多个列的话用","分隔
android:collapseColumns:设置自动隐藏哪些列,列ID从0开始,多个列的话用","分隔

顺便:android:layout_span表示一个控件占几列空间

下面的是基本的View,是在屏幕上画一条2dip高的一条横线
 <View
  android:layout_height="2dip"
  android:background="#FF909090"
 />

 

3、运行结果如下:



 


    
[3] JIL Mobile Widget 初始认识
    来源: 互联网  发布时间: 2014-02-18
JIL Mobile Widget 初步认识

   上星期去参加html5专题讲座沙龙,学到了点比较好奇的东西,所以回来研究研究!

前言
手机平台的技术发展与趋势,「从本机(Native Application)走向云端(Cloud Computing)应用」,是一个不能不谈的发展方向。在云端的架构之下,应用程序都可以由单机形式转变为Web Application。因为运算不在手机端了,是在服务器端;所以,「如果要你撰写一个能秀出服务器端图片的软件,你要怎么做?」


软件构思
传统的应用开发做法,会以单机应用做为思考出发点。一开始,我想:「利用ImageView组件,搭配Socket来连接服务器。」不过,经过一番研究后,想到:「 为何不想想HTML技术,这种方式不是会比传统的UI组件搭配运算代码方式更省力吗。」


图一:一开始的架构--ImageView搭配Socket

我又想:「意思是做成HTML文件,利用手机上的Browser来观看图片吗。这跟网页制作有什么不同。」

用Browser来观看HTML文件,在手机上需要有Browser才行。但Browser是一个完整的应用软件,不易于UI整合;因此,我们需要的是类似ImageView这种组件,但又要能完善支持Web技术,因为这样的组件才能嵌入到UI里,例如与Home Screen做整合,才能提供更佳的使用性。

JIL Mobile Widget带来新形态的软件开发模式

我的想法是:一个能完全支持HTML/CSS/JavsScript的「Web Widget」具备Browser的功能,又能以组件(Widget)的形式与手机UI结合。真有这种技术吗?有Browser的「功能」,又可以如组件(Widget)般嵌入UI!

OPhone的JIL Mobile Widget技术正是一个代表。

图二:采用Web导向方式

OPhone Platform的特色:「加入了由JIL所开发的Mobile Widget。」Mobile Widget提供了相当强大的HTML/CSS/JavaScript功能,特别是WDT(OPhone SDK的Eclipse开发插件)的配合,已经能实现一些「采用HTML制作应用软件、整合云端服务」的理想了。JIL与WDT是未来3G软件开发新模式的示范,值得我们去留意这个方向。

JIL Mobile Widget的应用开发模式



典型的Android应用程序采用Java语言开发,大多数运算被实作在本机上,意谓著这些应用程序都使用手持设备的运算(即Processor)资源;这类的应用程序就是我们经常看见的APK组件。JIL Mobile Widget与APK应用程序很不一样,整个应用就是一套网页,并被包装成WGT组件后安装到手机上。

1. 创建HelloWidget专案

利用Eclipse的New Widget Project功能,立即创建一份基本的JIL Mobile Widget应用,这个应用包含下列文件:

•HelloWidget.html - 主画面文件
•HelloWidget.js - JavaScript代码、由HelloWidget引入使用
•HelloWidget.css - 使用CSS做UI排版(Layout)
•Default.png - 背景图
•Icon.png - 图示
•config.xml - Mobile Widget的设置文件

这些都是WDT在创建Mobile Widget项目时自动产生的文件。有了WDT的协助,简单的Mobile Widget应用可以很快被创建。经过一番功夫,终于学习到OPhone Platform最精采的一项技术。这时,终於可以继续开发我的应用了。

2. 修改HTML (UI)

我首先想到的是:「更换HTML文件的背景图」。这个工作难不倒有网页制作功底的我,所以我很快就制作了一张全新的图档,并取代原来的Default.png。很快地,我了解到Mobile Widget是怎么一会事了。因为这和我过去在制作网页时,所使用的观念相同。

制作JavaScript功能

我继续制作著秀图软件。制作一个秀图软件倒底能有多简单?

制作秀图软件

我想要用JavaScript来展现照片的动态效果,所以很快地想到jQuery这个JavaScript库。 jQuery是一个相当受到欢迎的JavaScript库,jQuery改变我们撰写JavaScript的方式,现在,我们把它放到OPhone Platform里一起使用。也就是,如果我们能善用现有的Web Application技术,「制作联网的OPhone软件就是这么简单。」这是一个很棒的火花,也是移动技术的趋势。


於是我先将jQuery加了进来,然后修改HelloWidget.html,加入:


view plaincopy to clipboardprint?

    <script type="text/javascript" src="/blog_article/jquery.min.js"></script> 


然后又想到,「照片的画面编排呢?要怎么做?」因为用了Mobile Widget技术,所以当然是使用CSS来做UI排版。於是我又编写了一段CSS代码,同时用来取代自动创建的HelloWidget.css,并存成slideshow.css如下:

view plaincopy to clipboardprint?

    #home_slideshow { 
           width: 180px; 
    } 
    #home_slideshow img { 
        position:absolute; 
        z-index:8; 
        opacity:0.0; 
    } 
    #home_slideshow img.active { 
        z-index:10; 
        opacity:1.0; 
    } 
    #home_slideshow img.last-active { 
        z-index:9; 
        opacity:0.0; 
    } 



依软件架构的要求,先将3张图片放到我的Web空间里;然后加上了一段HTML代码到HelloWidget.html以秀出图片,并使用上述的CSS做UI排版:

view plaincopy to clipboardprint?

    <div id="home_slideshow"> 
    <img src="/consulting/1.jpg" width="240" alt="" /> 
    <img src="/consulting/%202.jpg" width="240" alt="" /> 
    <img src="/consulting/%203.jpg" width="240" alt="" /> 
    </div> 


搭配JavaScript可以做出什么效果呢?我决定展现一下过去设计JavaScript的功力,制作了一段代码,可以让3张图片以随机方式每次显示一张。「搭配CSS更可以做出一些显示效果。」把以下代码加入HelloWidget.html:

view plaincopy to clipboardprint?

    <script type="text/javascript"> 
      
           function slideSwitch() { 
                  var $active = $('#home_slideshow img.active'); 
                        var $sibs = $active.siblings(); 
                        var rnd = Math.floor(Math.random() * $sibs.length ); 
                        var $next = $($sibs[rnd]); 
      
                  if ($active.length == 0) $active = $('#home_slideshow img:last'); 
                  $active.addClass('last-active'); 
            
                  $next.css({opacity: 0.0}) 
                         .addClass('active') 
                         .animate({opacity: 1.0}, 1200, function() { 
                                $active.removeClass('active last-active'); 
                         }); 
           } 
            
           // Using jQuery 
           $(function() { 
                  setInterval( "slideSwitch()", 5000 ); 
           }); 
            
    </script> 


从这个例子来看,由JIL所制定与开发的Mobile Widget成功让手机软件开发成为一种「跨开发人员」的技术,同时配合API标准的制定,Mobile Widget还可以被导入不同的手机平台,成为一项3G应用开发的新标准。令人耳目一新!

使用Mobile Widget技术,我以最少的代码,完成了一个秀图软件。

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪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,