虽然网上有那么多资料,感觉还是有些不充分,不能解决我遇到的问题,因此我想把自己从0基础开始开发app的过程记录下来,一是自己总结回顾,而是给网友提供更多的视角.
1.控件布局会混乱
android stduio开发的界面不是所见即所得,你一运行总是发现不是你想要的效果;不过这也提供了另外一些好处,比如屏幕适配.
需要添加约束来解决这个问题;可以自动添加约束,也可以一个自己添加;自动添加约束一般都是混乱不堪的,根本达不到自己想要的效果;一个个自己来添加约束,发现太复杂了,连基本的对齐功能都很难搞定.
导航线这个作为基准非常有用,它可以很简单地将屏幕进行横纵等分,然后每个控件以等分线为基准,使用constraint fix,这样就可以将各个控件简单地对齐.
自由布局还是不会,不过先让它对齐就好了.更多详细请参考:Android 约束布局(ConstraintLayout)详解;我还画了一个思维导图:目标设置-思维导图 | ProcessOn免费在线作图,在线流程图,在线思维导图.
2.响应点击事件
网上资料说有三种方法,然后发现自己一种方法也不行.测试很多次后才明白,你必须debug模式启动才能调试断点;而且释放断点不能点击run,必须点击调试窗口中的那个按钮才行.,或者按F9;我是windows的vs2010开发者容易被那种习惯误导,这个android studio调试和运行居然是完全独立的.
响应点击事件有三种形式,我对前两种理解比较深刻,思维导图如下:
a.
b.
3.R.java文件不会自动生成
疯狂添加世界各新的子页之后,发现R.id不能用了,真奇怪;去google寻找解决方法:android开发中资源文件和资源ID是如何映射的 - 若彬的成长笔记 - CSDN博客,结果不行.
原来是有一个页面的导航线等分比例使用了分数6/11,导致界面编译出错.返回界面修改成小数就可以了;看来有错误先仔细查看错误提示才是最稳妥的办法.修改所有的分数为小数之后就可以了.(不要自作聪明觉得分数比小数好用,其实这个low的开发环境不支持);还好这个错误提示详细得夸张.
4.调试程序就崩溃,提示:Instant Run performed a full build and install since the installation on the device does not match the local build on disk.昨天还好好的,我没改任何代码.
不知道哪里的问题,最后重新写了一遍页面就可以了;还好页面的控件都可以直接复制,复制过去就可以正常运行了.每天记得备份代码git/svn
5.android library的创建及使用
稍微大一点的项目都应该分模块开发,这样便于修改和维护;andriod stdudio刚好提供了这样的功能;我将app分成MVC三分层,但是初期比较简单,似乎用不到controller;我准备创建四个模块;
1)创建流程
file->new->new model
选择andriod library->next
给新建model随便取个名字,我这里是netlib,然后下一步就会自动在项目中生成一个模块了;(model "net_lib"already exists这错误是我已经创建了这个模块,因此可以忽略)
1 发现每个新建模块都有一个子目录;2 每个子模块都有对应的build gradle;3 新添加的java类或者activity一定要在com.example.net_lib下面,不然app模块引用不了(我这里折腾了半天);
2) 使用
网上那些教程没有具体的使用举例,对于新手的我来说不知道怎么引用别的模块的类;折腾了半天;
要想在app项目中使用它,就双击进入build.gradle(model :app);添加这句代码:compile project(':netlib'),net_lib是自己的模块名;就这样就可以使用了,这句代码很重要;
其它教程说还在这里添加:include ':net_lib',我看本项目中自动就添加这句话了;忽略这个步骤;
我是在app项目中测试新建的模块;开始不知道怎么引用,直接照着其它引用路径写一下,com.example. 写到这里就自动提示了net_lib的存在;后面就正常使用了;
我是java和andriod开发全不会,项目需要就开始用了,欢迎菜鸟讨论很菜的问题;
5 软键盘导致按钮缩小问题
弹出软键盘后按钮被缩小了,网上很多方法都说添加一个scroll view,结果根本不起作用,后来发现一个超级简单而有效的方法,在setContent函数之前添加代码:getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);原文链接:软键盘弹出后,上部布局缩放的问题 - 前人挖坑,后人种(pen) - CSDN博客
效果如下,这才是常用软件的效果
6 ListView的操作
添加内容:【Android 开发】:UI控件之 ListView 列表控件的使用
更新内容:Android零基础入门第44节:ListView数据动态更新
获取复选框选择的内容:Android ListView组合CheckBox实现多选获取数据;原来安卓的布局可以任意组合,这点十分牛逼;
7 类的构造函数必须申明为public,否则其它package里面无法创建这种对象;
8 andriod studio无法像visual studio一样通过编译错误直接定位到语法错误的代码;按F2键好像可以,但是不是那种精准定位;还有就是使用代码分析功能,Analysis->code inspect,这个也是乱提示;
9.按钮颜色的动态修改:Android 用代码设置控件颜色,还是这种代码修改简单快捷有效,有xml来修改居然没有效果;
10.加载相册:Android中读取系统图库(包含相册)中的图片,显示图片与图片的路径 - ABC__D的专栏 - CSDN博客
引用比人的源码原来就是自己创建一个andriod library,然后将代码和res等拷贝到对应的位置,然后去andriod studio看就自然有了这些文件,这个跟vs 2010不一样;
以前我在编译的时候就只盯着运行错误看,原来下面还有编译错误,直接点击编译错误可以定位到错误源码,这个才跟vs一样方便嘛;
库的有些语法错误也能直接编译通过,只是你用的时候就找不到这些类,需要把修改正确然后就能用了;
文件权限获取:Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/i,要用动态代码获取权限,否则所有文件读取操作都会出异常.
______________________________________________2019-1-2更新
花了接近两周的时间才把服务器的消息队列和消息解析的逻辑框架做好,今天来测试app的socket发送数据发现一个怪问题,一连接服务器就崩溃了,但是在类的main函数中执行连接却是可以的;
这个测试函数里面测试可以正常连接;但是有另外一个问题,服务器收到的消息今天是EPOLLRDNORM,导致无法建立连接,昨天都还是正常连接并能正常发送数据的;还不知道是申明原因!
app启动的时候执行服务器连接,每次都崩溃,也捕捉不到异常对象;捕捉不到异常对象,发现是IOExceptoin的问题,连接时的这个异常不属于IO异常;修改成Exception就能捕捉到异常提示 了,原来是需要子线程来执行网络IO【Android开发那点破事】解决android.os.NetworkOnMainThreadException - Cross - CDNA,真心坑;为了实现客户端的异步通信,还得重新设计整个app的交互架构;瞬间感觉心情比较郁闷,想来知乎上记录一下!
一般解决异步问题的方法都需要弄一个消息队列;专门用于网络通信的话就需要弄一个reactor模式;初期还是不要弄得太复杂;弄一个最简单的模型就可以了;先用一个消息队列来实现!
尽量减少代码的修改,就直接在net类中启动一个线程就好了;发送数据比较好实现,就是直接把json对象丢到任务队列上去,然后子线程完成发送就好了;但是接收数据就有点不好处理了,接收到数据之后需要通知对应的业务处理类来处理,那么这个接收对象就要知道怎么通知是哪个窗口接收消息,感觉这里就需要有一个窗口消息分发机制了;必须得使用一个子线程来协调数据与显示才行:JAVA多线程实现的三种方式 - 步春良 - CSDN博客;开始准备省略掉controller,现在看来还是得使用controller才行,好吧,现在按照真正的MVC架构;
这种强制性的框架真令人恶心;我本来想把一个完整的业务模块走通再来搞架构和性能的,现在看来需要提前做了;
服务端的数据库技术还没走通,还是存在着一定的风险:Mysql安装与c++使用mysql - Watson2016的博客 - CSDN博客;数据库操作非常简单,基本可以忽略;新建mysql账户: MySQL创建用户与授权,sql命令都需要加分号结尾(;),否则语句一直不执行;
————————————————————————————————2019-2-17
1.安卓模拟器无法连接到本地服务器,单独测试连接可以,报错:"failed to connect to localhost/127.0.0.1 (port 8080): connect failed: ECONNREFUSED (Connection refused)" (id=830021648792) 解决方法:java - 连接失败:ECONNREFUSED - 代码日志