今晚要检查进度,赶在下午把前后端合并完成。后端两位同志很给力地接好了数据库,并且写好了登录注册和检索题目三个功能。我慢一点,写好了登录和注册的界面,已经对接完毕。
效果大概如下:
登录界面
注册界面1
注册界面2
注册界面2 滚动选择器效果
这个滚动选择器是借用的大佬的代码,大家看这里:
滚动选择器
我改动了一点点,包括各个控件的高度和位置,但是现在确定键还有一点点挡,后续还需要微调。然后外层button的内容没有设默认值,在改动后会设置成为当前选择值。
这里后端朋友说数据传后台的时候编码有点问题,用中文会乱码,但因为时间比较赶,就先全英文了,后面再改。
下面说几个遇到的问题和解决方法。
如何隐藏标题栏 NoTitleBar
可以看到现在的几个标题栏都是隐藏了的,这个地方需要在AndroidManifest.xml下进行设置
<activity
android:name=".register"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.NoActionBar"></activity>
<!-- 设置为singleTask模式,这样从在注册两个页面间反复横跳时不会丢失之前填的数据 -->
当然launchMode大家自己选择。这里起作用的是theme那一行,这样这个activity就不会有标题栏了。
这里我们的activity是继承的AppCompatActivity类,也是现在android studio默认的,因此这样改不会冲突。
如果你这里继承的改成了Activity类,你可以写
<activity
android:name=".register"
android:theme="@android:style/Theme.NoTitleBar">
</activity>
但是这样的话,几乎所有跟image相关的控件都需要间接引用,因为在Activity下面没有这些类。比如原来的ImageView,需要改成androidx.appcompat.widget.AppCompatImageView.
网上还有一种方法,在活动的java文件里写两个方法设置不显示标题栏,那个好像也要求你的活动继承Activity,不然是无效的。
相对而言,我更建议使用这里的第一种方法,AppCompat它不香吗?
关于升级到Androidx
我是从零开始凭空写的,自然是新建了一个空白的工程,而Android Studio的全新版本自然是默认用的Androidx。但是我的后端小伙伴们是硬撸的,他们从别人那里搞了一份开源代码在复用,因此一开始就是在别人的工程基础上改的,而那个工程是Android.support的老版。
因此在第一次合的时候,我的所有androidx的东西都不能跑。选择哪个版本呢?自然是选择google公司有在维护的新东西。于是后端小伙伴们新建了一个工程,把代码粘进去(因为代码量还不大),有问题的地方改掉,才合成功。
Androidx对SDK好像有版本要求。虽然配环境的时候大家应该都是装的我发群里的一个文件,但不知道为什么有位小朋友跑偏了,下了三个SDK,最后装上了一个最老版本,不支持Androidx。同时请确保工程里的gradle版本在3.4以上。
关于Button总是在最上层
首先记住一点,在android的xml中,都是先静态添加一个控件,剩下的控件通过addView动态添加。那么如果有控件覆盖的情况,先加入的控件就会被后加入得控件覆盖。
而Button本身挺烦的,这似乎是安卓的一个小bug。因为它有个按下之后的阴影还是什么问题,它会永远在最上层,不能被覆盖。大家可以看到我的最后效果里,滚动选择器应该在最上层,挡住下方的注册按钮。这里我比较推荐的方法是在Button控件里加一句:
android:stateListAnimator="@null"
bringToFront并不能阻止Button在最上层。当然我也可以在调出滚动选择器的时候加一句隐藏按钮,那就比较麻烦了。
也有人建议在Button外面裹一层layout,不知道为什么对我不适用。
一个比较全的总结见这里:
Android Button 总是在最上层的问题
空指针报错
看到空指针自然是很慌的,回想起数据结构的时候被空指针支配的恐惧……
看一下它指向的对象是啥:
pickerscrlllview.setOnSelectListener(pickerListener);
哦,是pickerscrlllview。可以确认的是,外面名字没有写错,那就是赋值这一步出错了:
pickerscrlllview = (PickerScrollView) findViewById(R.id.pickerscrlllview);
事实证明,包含有id为pickerscrlllview的那个xml文件没有被引用。后端小伙伴在合的时候复制了两行<include layout="@layout/picker_layout2" />
然而并没有Include layout.xml,自然后续就报错了。
小心路径
如果你的程序报错android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating
那么大概率是你粘了别人的代码,然而改路径没有改完。我自个儿用滚动选择器的时候就跟这个error斗争过了。不幸的是,我和后端小伙伴们的路径也不一样,他们也没改干净,因此在这里卡了很久。
不要以为没有红色就是改完了!看一眼xml文件,它不会红,但是它可能有问题:
<com.example.cs.views.PickerScrollView
android:id="@+id/pickerscrlllview"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#ffffff" />
你看,这里也需要路径,但是如果你的路径是错的,它不会提示你(摊手)。
其它的都是些小问题啦,基本上搜一搜就出来了,就不记录了。
下周可能要赶一下计算机系统安全和计算机体系结构的实验,不知道这边能做多少,加油吧。