android开发新浪微博客户端+完整攻略Word文档格式.docx
《android开发新浪微博客户端+完整攻略Word文档格式.docx》由会员分享,可在线阅读,更多相关《android开发新浪微博客户端+完整攻略Word文档格式.docx(115页珍藏版)》请在冰豆网上搜索。
1.<
?
xmlversion="
1.0"
encoding="
utf-8"
>
2.<
LinearLayoutxmlns:
android="
3.android:
id="
@+id/layout"
4.android:
orientation="
vertical"
5.android:
layout_width="
fill_parent"
6.android:
layout_height="
7.<
ImageView
8.android:
wrap_content"
9.android:
10.android:
src="
@drawable/ver"
11.android:
layout_marginTop="
15dip"
12.android:
layout_marginLeft="
13.<
/ImageView>
14.<
RelativeLayout
15.android:
16.android:
17.<
18.android:
19.android:
20.android:
@drawable/logo"
21.android:
layout_centerInParent="
true"
22.<
23.
24.<
25.android:
26.android:
27.android:
@drawable/dev"
28.android:
layout_alignParentBottom="
29.android:
layout_alignParentRight="
30.android:
layout_marginRight="
5dip"
31.android:
layout_marginBottom="
35dip"
32.<
33.<
/RelativeLayout>
34.<
/LinearLayout>
复制代码
三、在ec打开名为MainActivity的Activity源代码文件进行编辑,onCreate部分代码如下:
1.publicvoidonCreate(BundlesavedInstanceState){
2.super.onCreate(savedInstanceState);
3.setContentView(R.layout.main);
4.}
然后运行项目可以在模拟器中显示,上面的几个图片都按照设计的位置和效果进行显示只是整个页面的背景还是黑色的,接下来就是背景部分的显示实现,由于为了实现横竖屏切换显示,背景图的显示采用代码进行控制显示,首先用如下方法获取当前手机是横屏还是竖屏:
1.//获取屏幕方向
2.publicstaticintScreenOrient(Activityactivity)
3.{
4.intorient=activity.getRequestedOrientation();
5.if(orient!
=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE&
&
orient!
=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
6.//宽>
高为横屏,反正为竖屏
7.WindowManagerwindowManager=activity.getWindowManager();
8.Displaydisplay=windowManager.getDefaultDisplay();
9.intscreenWidth=display.getWidth();
10.intscreenHeight=display.getHeight();
11.orient=screenWidth<
screenHeight?
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
12.}
13.returnorient;
14.}
然后编写一个名为AutoBackground的公共方法用来实现屏幕背景的自动切换,后面的几乎每一个功能页面都需要用到这个方法
1.publicstaticvoidAutoBackground(Activityactivity,Viewview,intBackground_v,intBackground_h)
2.{
3.intorient=ScreenOrient(activity);
4.if(orient==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){//纵向
5.view.setBackgroundResource(Background_v);
6.}else{//横向
7.view.setBackgroundResource(Background_h);
8.}
9.}
完成上述两方法后在MainActivity的onCreate方法中调用AutoBackground方法进行屏幕自动切换:
1.LinearLayoutlayout=(LinearLayout)findViewById(R.id.layout);
2.//背景自动适应
3.AndroidHelper.AutoBackground(this,layout,R.drawable.bg_v,R.drawable.bg_h);
到此完成了载入页面的UI部分的实现,测试运行模拟器中查看效果,基本上跟最上面的设计效果图相符,测试效果图如下:
47上传
下载附件(94.6KB)
下载附件(97.9KB)
android开发我的新浪微博客户端-载入页面sqlite篇(1.2)
通过上一篇文章(android开发我的新浪微博客户端-载入页面UI篇(1.1))已经完成了载入页面的UI部分的实现,效果如上图,接下来在上面的基础上完成载入页面的功能代码。
51上传
首先说明一下新浪微博提供了OAuth和BaseOAuth两种认证方式(如果不知道什么是OAuth和BaseOAuth请自己google一下恶补,同时接下来的2篇随笔也会对这方面进行详细的说明以及具体实现),本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、AccessToken、AccessSecret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到sqlite库中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从sqlite库中读取出来即可,由于这样的需求载入页面的功能设定是这样:
当用户打开软件显示载入页面时开始检查sqlite库中是否已经保存有用户的新浪微博的UserID号、AccessToken、AccessSecret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这3个值保存到sqlite库中,如果已经包括了记录,那么读取这些记录的UserID号、AccessToken、AccessSecret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。
上面功能设定中涉及到sqlite数据库的创建、数据表的创建、数据记录的添加、数据记录的读取等操作,这里新建名为SqliteHelper.java类文件提供sqlite数据表的创建、更新等,代码如下:
1.publicclassSqliteHelperextendsSQLiteOpenHelper{
2.//用来保存
3.UserID、AccessToken、AccessSecret
4.的表名
5.publicstaticfinalStringTB_NAME="
users"
;
6.publicSqliteHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){
7.super(context,name,factory,version);
8.}
9.//创建表
10.@Override
11.publicvoidonCreate(SQLiteDatabasedb){
12.db.execSQL("
CREATETABLEIFNOTEXISTS"
+
13.TB_NAME+"
("
14.UserInfo.ID+"
integerprimarykey,"
15.UserInfo.USERID+"
varchar,"
16.UserInfo.TOKEN+"
17.UserInfo.TOKENSECRET+"
18.UserInfo.USERNAME+"
19.UserInfo.USERICON+"
blob"
20."
)"
21.);
22.Log.e("
Database"
"
onCreate"
);
23.}
24.//更新表
25.@Override
26.publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
27.db.execSQL("
DROPTABLEIFEXISTS"
+TB_NAME);
28.onCreate(db);
29.Log.e("
onUpgrade"
30.}
31.//更新列
32.publicvoidupdateColumn(SQLiteDatabasedb,StringoldColumn,StringnewColumn,StringtypeColumn){
33.try{
34.db.execSQL("
ALTERTABLE"
+
35.TB_NAME+"
CHANGE"
36.oldColumn+"
"
+newColumn+
37."
+typeColumn
38.);
39.}catch(Exceptione){
40.e.printStackTrace();
41.}
42.}
43.}
接下来新建名为DataHelper.java类文件实现用户记录的创建、更新、删除等,代码如下:
1.publicclassDataHelper{
2.//数据库名称
3.privatestaticStringDB_NAME="
mysinaweibo.db"
4.//数据库版本
5.privatestaticintDB_VERSION=2;
6.privateSQLiteDatabasedb;
7.privateSqliteHelperdbHelper;
8.
9.publicDataHelper(Contextcontext){
10.dbHelper=newSqliteHelper(context,DB_NAME,null,DB_VERSION);
11.db=dbHelper.getWritableDatabase();
13.
14.publicvoidClose()
15.{
16.db.close();
17.dbHelper.close();
18.}
19.//获取users表中的UserID、AccessToken、AccessSecret的记录
20.publicList<
UserInfo>
GetUserList(BooleanisSimple)
21.{
22.List<
userList=newArrayList<
();
23.Cursorcursor=db.query(SqliteHelper.TB_NAME,null,null,null,null,null,UserInfo.ID+"
DESC"
24.cursor.moveToFirst();
25.while(!
cursor.isAfterLast()&
(cursor.getString
(1)!
=null)){
26.UserInfouser=newUserInfo();
27.user.setId(cursor.getString(0));
28.user.setUserId(cursor.getString
(1));
29.user.setToken(cursor.getString
(2));
30.user.setTokenSecret(cursor.getString(3));
31.if(!
isSimple){
32.user.setUserName(cursor.getString(4));
33.ByteArrayInputStreamstream=newByteArrayInputStream(cursor.getBlob(5));
34.Drawableicon=Drawable.createFromStream(stream,"
image"
35.user.setUserIcon(icon);
36.}
37.userList.add(user);
38.cursor.moveToNext();
39.}
40.cursor.close();
41.returnuserList;
43.
44.//判断users表中的是否包含某个UserID的记录
45.publicBooleanHaveUserInfo(StringUserId)
46.{
47.Booleanb=false;
48.Cursorcursor=db.query(SqliteHelper.TB_NAME,null,UserInfo.USERID+"
="
+UserId,null,null,null,null);
49.b=cursor.moveToFirst();
50.Log.e("
HaveUserInfo"
b.toString());
51.cursor.close();
52.returnb;
53.}
54.
55.//更新users表的记录,根据UserId更新用户昵称和用户图标
56.publicintUpdateUserInfo(StringuserName,BitmapuserIcon,StringUserId)
57.{
58.ContentValuesvalues=newContentValues();
59.values.put(UserInfo.USERNAME,userName);
60.//BLOB类型
61.finalByteArrayOutputStreamos=newByteArrayOutputStream();
62.//将Bitmap压缩成PNG编码,质量为100%存储
63.userIpress(Bitmap.CompressFormat.PNG,100,os);
64.//构造SQLite的Content对象,这里也可以使用raw
65.values.put(UserInfo.USERICON,os.toByteArray());
66.intid=db.update(SqliteHelper.TB_NAME,values,UserInfo.USERID+"
+UserId,null);
67.Log.e("
UpdateUserInfo2"
id+"
"
68.returnid;
69.}
70.
71.//更新users表的记录
72.publicintUpdateUserInfo(UserInfouser)
73.{
74.ContentValuesvalues=newContentValues();
75.values.put(UserInfo.USERID,user.getUserId());
76.values.put(UserInfo.TOKEN,user.getToken());
77.values.put(UserInfo.TOKENSECRET,user.getTokenSecret());
78.intid=db.update(SqliteHelper.TB_NAME,values,UserInfo.USERID+"
+user.getUserId(),null);
79.Log.e("
UpdateUserInfo"
80.returnid;
81.}
82.
83.//添加users表的记录
84.publicLongSaveUserInfo(UserInfouser)
85.{
86.ContentValuesvalues=newCont