网上商城APP软件开发与使用

、基本构造

本软件目前有两个包,com.example.siasun 和 com.shop.siasun.bao,包中含有各种程序。

 (新版本增加——为了方便使用和扩展,合并成了一个包。)

 

 

二、基础类

       本软件目前有 2 个基础类:BaseActivity 和 Activity,它们是所有其它类(class)运行的基础,其它类需要继承(extends)这些基础活动来实现一些基本的功能,使用一些基础成员变量,也可以重写或重载基础的方法或成员变量。(Java 的特性就是面向对象,封装,继承,多态,这些特性十分重要,基于 linux 的安卓,也用到了许多 Java 的特性)。继承的基本关系是子类和父类,被继承的类是父类,Java 中只能支持一个父类继承,不支持继承多个父类。

        BaseActivity 其实是 Activity 的一个子类,Acitivity 是安卓中的一个最基础的默认类。本软件为了编程上的便利,新设了一个继承 acitivity 的 baseacitivity,加入了一些静态的成员变量和方法,用于读取状态,保存账号密码等。关于静态概念,详情见图。

 

三、其它类的介绍

1.APPStart(启动引导动画)

 

(新版本增加,全屏动画引导(左图)

<activity

android:name=".AppStart"

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <intent-filter>

<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>

</activity>

在 androidManifest 中,对 AppStart 活动中添加。

本软件自己设定了启动引导动画,图片素材存放在 res/drawable-hdpi 中,主程序使用了AlphaAnimation,Animation,AnimaionListenner(接口)等方法,需要注意的是:在 AndroidManifest 中,我们将此活动设置成主活动,并在启动时第一个运行。

<activity

android:name=".AppStart">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<categoryandroid:name="android.intent.category.LAUNCHER"

/>

</intent-filter>

</activity>

 

2.MainActivity(主要活动)

 

(新版本增加,按键上增加了图标,图标全部要用透明背景的 png 图片,另外在图片上也添加了按键变色,在对应的界面图标变黑。(左图))

需要注意的部分:

注意,因为 MainActivity 与其他活动的关联互动较多,在 androidManifest 中,因该设置成:

<activity android:name=".MainActivity" 

android:launchMode="singleTask" 

android:label="MainActivity"

 > 

</activity>

同时只允许一个 MainAcitivty 运行,防止有多个主程序在运行,导致程序退出后多次跳转其它 MainAcitivty,严重化导致系统闪退!

 

Webview 插件在使用前,要先在 androidManifest 中获得 Internet 使用权限。

<uses-permissionandroid:name="android.permission.INTERNET" />

Webview 支持的域名必须为 http 开头。

某些情况下 webView 的 layout_width 一定要 match_parentlayout_height 在有些情况下一定要 Match_parent

 

3.代码部分

a. 使用图片轮播控件(view flipper)

 

在 res 文件夹自定义 anim 动画效果 left_in,left_out,实现轮播动画效果,图片保存在 drawable 文件夹中,view flipper 使用数组方法进行图片的调用。

private   int[]   resId  = {R.drawable.main_pic1,R.drawable.main_pic2,R.drawable.main_pic3};

 

b.使用 webView 控件

重要的是调用了: public  boolean  shouldOverrideUrlLoading(WebView  view, String url)方法,实现在当前界面直接划出一块区域显示公司主页,不用调用浏览器。

1.Webview 拨号

通过网站的拨号按钮实现直接打开手机的拨号界面,自动填入手机号。此处需要通过 url 读取公司的电话号码。具体操作已经有代码注释。

2.Webview 短信

通过网站直接打开手机短信界面,并自动填入手机号。此处执行通过代码填入公司的电话号码。具体操作已经有代码注释。

需要注意的是,网页提出电话短信要求时,会在 url 字符串头自动添加 tel 或 sms 的字符串,这里调用 String 类的 startsWithString a方法,对头字符串进行解析,判断是要打电话还是发短信,然后用 Intent 内置的方法 ACTION_DIALACTION_SENDTO 打电话或发短信。

 

c. 重写安卓返回键监听事件

为了防止在使用应用的过程中,误触返回键造成应用退出与增加应用的友好性,此处重写了安卓自带的返回键监听。

重写方法:public booleanonKeyDown(intkeyCode, KeyEvent event),主要逻辑是:在主界面浏览公司网页时,可以点击链接访问网页内容,而按下返回键时,进行判断:当前网页是否是主页,若不是,返回上一页面;若是,则调用双击退出程序(该程序自行编制用到了定时器 timer 检测连按返回键的时长,判断是否退出,定时 2000 毫秒)

 

d.底部按键逻辑

底部有四个按键,逻辑为:如果用户还没有登录,那么无论他点击账号管理,快乐购物,还是订单管理,都会优先跳转到用户登录界面,登录完成之后,按下按钮,先读取登录状态,登录成功则跳转相应的页面。

 

e.关于布局

(新版本添加——

为了可维护性,新版本优化了标题栏,缩减到了三个,并且动态地显示每一个的标题,另外还自定义了在标题中的返回按钮,具体如下:

Title

Title0

Title1

布局中为了适配不同手机的尺寸,全部使用了 LinearLayout返回键使用的是透明背景的图片这样按键反馈变色不会被遮挡。为了使返回键男工作,要单独写一个 TitleLayout.class 实现其功能。通用标题栏在活动中自行设置标题。标题颜色为了节省空间和内存,使用 16 进制代码进行表示。)

 

本 软 件 主 要 布 局 用 2 种 , LinearLayout 和RelativeLayout。因为布局特性,自定义了 3 中 title 样式( LinearLayout 中 用 titile+ 标 题 名 结 合 形 式 , 而 RelativeLayout 中使用 titile+自定义标题名形式)。

title

 

title0 (relativeLayout布局中使用)

Title1布局中可以嵌套布局(视作一个控件)。

 

四、Login ActivityCollector

 

这两个活动是在登录时创建的,用于登录和记住密码。在未登录的状态下,点击账户管理,快乐购物,订单管理,都可以实现登录。

 

未实现的部分——

注意现在只能模拟本地登录,无法与网站通信,有待继续扩展。

自动登录功能还未实现,有待继续扩展。

注册目前依旧只能跳转网页注册,有待继续扩展。

 

需要注意的部分

新版本增加——

 

 

 

底部导航栏选择菜单在 ve.1.2.0 版本开始就布局到了每一个界面,因此,按键上的图片也要进行按键反馈,原理与按键变色相同。

 

登录按钮的背景使用了:

<Button

android:id="@+id/login"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_span="2"

android:background="@drawable/login_button_selector2"

android:textColor="#ffffff"

android:text="登录" />

 

这个背景不是图片,而是自定义的字符串,在 drawable 文件夹之中,本软件使用了 3 个自定义的按键背景,实现按键变色反馈的功能。 以其中一个布局为例

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/clr_normal"

android:state_pressed="false"/> 

<item android:drawable="@drawable/clr_pressed"

android:state_pressed="true"/>

</selector>

 

我们定义 2 个状态,按下和正常,2 个状态的底图为 clr_normal 和clr_pressed。这两个值通过二维码色表定义在 values/strings 中,通过代码定义。

<drawablename="clr_normal">#ff6501</drawable>

<drawablename="clr_pressed">#a44100</drawable>

<drawablename="clr_normal1">#ededed</drawable>

<drawablename="clr_pressed1">#cccccc</drawable>

<drawablename="clr_normal2">#00B2EE</drawable>

<drawablename="clr_pressed2">#0000CD</drawable>

(关于二维码色表,  通  过 以  下  网  址  查 询  :http://www.cnblogs.com/android100/p/android-rgb-list.html)

不只是这两个活动,除了 MainActivity 以外的所有活动,都应该在结束的时候调用 finish();方法来结束活动,释放内存,确保程序不会冲突。

 

代码部分:

a,ActivityCollector

自定义了 ActivityCollector 这个类,用于对活动进行增加,移除和删除,pdf 中用到,具体作用可参考 pdf。

b.SharedPreferences 方法

Pdf 中已经有详尽介绍和例子,此处仅稍微修改。实现了记住密码和账号,并且下次打开软件登录时可以自动填充。这里定义的 pref,accountEdit,passWordEdit,account,passwor,a等都是静态的成员变量,在 BaseActivity 中已经定义,现在可以直接使用,方便日后在别的活动中读取账号和密码。

保存的数据在 data/data/com.example.siasun/shared_prefs 文件夹中。

c. Intent 中使用 Extra 传递数据

MainActivity中按下按钮式若跳转到登录界面,我们没有单纯地使用Intent.startAtivity(Intent intent); 这个方法,而是使用了startActivityForResult(intent, 1);这个方法,这是因为,我们需要登录活动返回一个登录成功的信号给 MainActivity。这样在下次点击按钮时,主程序就知道我们已经登录,进行相应的跳转。在 Login 中,当我们登录成功时,我们用:

Intent intent = new Intent();

intent.putExtra( "a", "true");

setResult(RESULT_OK, intent);

这个代码来传输成功数据给 MainActivity。具体阅读 pdf 中的 Intent 章节。

 

五、AccountManage

点击账号管理就能进入。

 

新版本添加

底部导航栏(左图)

 

代码部分

a.显示当前用户名

这里的两个按键也是使用了按键反馈,不再赘述。唯一的难点,就是对用户名的动态显示。

文本的显示是使用的 textView 控件,这个控件十分地常用,问题在于,textView 控件一般都是直接显示代码中的文字,要做到读取某个成员内容,需要一些特殊的方法,代码中使这样实现的:

TextView AccountName = (TextView) findViewById(R.id.acc); String html = BaseActivity.getAccount();

CharSequence charSequence = Html.fromHtml(html); AccountName.setText(charSequence);

在 BaseActivity 中我们定义了一个静态方法 getAccount()用来获取当前用户名,再把用户名通过 Html.fromHtml(String a);这个方法复制给一个 CharSequence 的类,最后用 TextView 中的 setText(String a);这个方法对显示的文本进行设置。

 

b.关于注销和切换账号,pdf 已有详细地介绍,不在赘述。(书中的注销账号用的是广播的方法,太过复杂,这里我是自己写的简单的方法,比较容易)。

 

五、GoodsList.java

点击快乐购物可以进入。

 

新版本增加:

完全修改下单界面

使用 spinner 下拉菜单选择商品

只有在点击个性需求后才能输入个性化语句

根据 spinner 的选择动态地显示图片

 

未实现的部分:

现在还无法联网下单。

 目前参考http://blog.csdn.net/zhyl8157121/article/details/8169172已实现功能。

 

需要注意的部分:

这里为了便于使用,重新设计了一个包:com.shop.siasun。

 

该包中有两个类,GoodList 和 NumberButton。

我们先讲解 NumberButton.java 这个类。

  

代码部分:

a.NumberButton

所有的购物软件,基本都有一个选择选择每件商品购买的数量的控件。但是,安卓默认不带这个控件!为了以后编程也能使用这个控件,本软件自定义创建一个新的类和布局,并且对按键的样貌个功能全部进行了编程。

NumberButton 因为是一个自定义的控件,在 layout 中也要定义它的布局。 NumberButton 因为和主程序不在一个包中,因此主程序的友好型变量和方法无法继承(java 中的继承特性),GoodsList 同理。

NumberButton 因为不是一个活动,因此在 androidManifest 中不需要注册。

 

b.GoodsList

这是一个购物活动,GoodsList 的布局是一个 linearLayout 嵌套一个 tablelayout 加一个底部导航栏。

Spinner 中的选项是在 values/arrays 中定义的。

订单保存是在按下“立刻下单”之后,通过 sharedpreference 保存在和账号密码同一个文件中。

这个是购物活动,因为和主程序不在一个包中,因此,在 androidManifest 里注册的时候,要写全名:       <activity

android:name="com.shop.siasun.GoodsList">

 activity>

GoodsList 的布局是 RelativeLayout 中增加了一个 Scroll 的滑动控件,其中嵌套了一 TableLayout,目的是为了便于商品的增加和排版的整齐。需要注意的是,我们在使用之前自定义的数量加减控件时:

 <com.shop.siasun.NumberButton

 android:id="@+id/number_button1"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:gravity="right">

 </com.shop.siasun.NumberButton>

 要打路径的全称,才能辨认。

 杯子的图片保存在 res/drawable-hdpi 中。

 点击购买后会提示购买成功然后自动跳转到订单管理。

 

六、OrderManage

 

点击订单管理可以进入

 

未实现的部分

现在只是一个浏览器窗口,因为通信没完成暂时无法实现,有待继续扩展。

 

七、About

 

点击关于我们可以进入。

 

代码部分

a.scrollView

通过 ScrollView 内安插 TextView,显示关于新松的介绍(日后对内容进行修改)。

b.拨打电话和发送短信原理与主页的相同,不加赘述。

 

图片放大功能

About 中对图片添加了一个放大图片的插件,用于对二维码进行放大。

具体事项方法,可以查看素材中的 imageShower 源码例子。

在本软件中,图片放大功能用在了“关于我们”的二维码中。

 

其它关于开发的注意事项

为了初步事项底部导航栏,使用了比较低级的方法:在每个界面都手动安置了导航栏,并且对每一个按钮进行功能的实现,从运行上来看,底部的导航栏好像是同一个,但是实际上,他们都是不同独立的,只是外貌完全相同罢了。底部导航栏的确是增加了易用度,各个窗口之间的切换更加方便了,不用像以前一样每次都要返回主界面再跳转了。

 

但是多次使用后发现了一个小问题:因为安卓默认动画为缩放切换的原因,底部标题栏在窗口切换的时候回有短暂的缩放重叠的感觉,又因为这个过程十分的快,盯着导航栏看的话,重复几次会头晕,为了解决问题,使用了渐变切换的效果,上网查找资料,自定义了动画效果,并且加以使用,最后的效果十分的好,软件用起来更加地顺手了。

 

动画重写,在 res/values/styles 中,动画使用在 androidManifest 中设置。

 

八、关于 eclipse(后期使用Android Studio)

一些操作提示

a. Import

在 package Explorer 空白处右键选择 import,选择从现有安卓程序导入,选择 browse 查找

发生了这种错误,这是因为,文 件不能存放 在你的workspace 中,而应该存放在其它的地方。

a.界面操作

b.关于闪退

可能是 androidManifest 中没有注册相应活动。

可能 onCreate(){}主方法没有写或者有误。

可能这个活动的 setContentView();没有,没有加载布局。

最头疼的,虚拟机运行正常,手机实机测试开机闪退,很有可能是 outOfMemory,即图片之类的加载太多,爆内存,这个就需要优化了,如活动结束就 finish();,压缩图片大小,一个页面不要放太多图片等,具体问题都可以在 logcat 的日志中看到,关于 logcat 的使用方法见 pdf。

 

C.其它

背景图片必须为 png 格式。

linearLayout 布局整齐,但是可能会有很多限制。

RelativeLayout 布局灵活,但是对应不同的手机屏幕大小可能会发生错版。

TableLayout 布局整齐,每加一行都要新写<TableRow> <内容></TableRow>。

 

d. 关于手机连接电脑调试

Usb 连接电脑,手机打开开发者选项,并且允许 usb 调试,连接电脑安装手机驱动,完成后在 usb 配置用启用 RNDIS(usb ethernet),随后,你就能在 devices 中看到你自己的手机,测试运行时可以直接安装软件到你的手机,logcat 也会显示在手机上运行程序的日志了。

 

新版本增加

Logo 重新制作了一个,注意图片尺寸,在更换 logo 时可能出现手机上 logo 没有变得情况,这是因为,在安装时系统把 bin 文件夹装入手机,bin 中有安装包和一些资源,包括 logo,因此 drawable-hdpi 中的 logo bin/drawable-hdpi 中的 logo 要同时更换。

老版本在直接点进“关于我们”之后,载跳转到账号管理出现了闪退的问题。在加入底部导航栏之后,软件才产生了闪退的情况。在进行排摸之后发现:软件机内主界面后无论点击哪个菜单按钮,都要先登录才跳转,唯独当时出于使用方便,在点击“关于我们”的时候,设置成了直接跳转,这就导致先进入“关于我们”之后,再跳转到其他网页时跳过了登录的步骤,而到“账号管理”的时候因为系统没有登录而产生了冲突!发现问题后,参

startActivityForResult 的方法,对每一个活动都进行修改,在点击时判断是否已经登录,否则跳转登录。把每一个活动都标了一个标志码,这样在登录完成返回之后,每个活动可以判断登录信号是否为自己发出的。

posted @ 2018-02-01 11:03  phbphb  阅读(539)  评论(0)    收藏  举报