工作第一个任务,写一个点击按钮和滑动都可以打开的侧滑栏,作为刚刚开始的菜鸟,写篇心得。
首先是在布局方面的坑,按下按钮之后发现没有反应,查询之后现在发现了问题所在是因为按钮所在的子布局中还有按钮,所以子按钮可以点击但是父按钮点击不了。现在还没改,之后再说吧。
然后是侧滑栏的布局,目前直接在mainActivity中写了个左侧滑栏的布局,一堆的菜单和一个退出的按钮,主要是滑动使得界面展示,点击按钮变色,xml布局,读取数据,绑定界面。
在最开始的绑定界面的过程中,不同于以前的findVIewById方法,采用的是viewModel + viewActivity的java代码,通过databinding的方法实现对控件的绑定。因为学到了很多,所以简单记一下怕以后会忘。
首先是侧滑栏的使用,可以参考Android高级UI开发(九)之侧滑菜单 --抽屉_gaoxiaoweiandy的专栏-CSDN博客_android侧滑菜单
通过在所需要侧滑栏的页面直接创建侧滑栏的.xml布局,需要注意的是侧滑栏并不是一个单独的页面,而是在一个页面中隐藏的页面,滑动之后显示,平时不显示而已。因此不需要单独再创建一个activity,在需要侧滑栏的页面的xml中添加布局就可以。
问题是在这样的情况下会使得页面的xml文件冗长,因为需要在xml对应的java文件中初始化控件,添加<include>拆分页面的方法不太行,还没有想到合适的解决方法。哭哭~可能是因为我在页面开始直接写了DrawerLayout,可能不这样写便于拆分页面吗
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainDrawerLayout" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:fitsSystemWindows="true" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/mainToolbar" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
DrawerLayout的优势对我而言是实现的效果可以直接让源页面作为背景不被覆盖,
这样可以在源页面上显示半个抽屉,不影响源页面的显示,但是需要在定义的抽屉页面中加入
android:clickable="true"
否则源页面中的控件还是可以被点击或者滑动,显得很奇怪,
<LinearLayout android:layout_width="228dp" android:layout_height="fill_parent" android:layout_gravity="start" android:orientation="vertical" android:paddingTop="50dp" android:clickable="true" android:background="#202020">
另外
android:layout_gravity="start" 是左滑动栏,end是右边,center是中间主页面。
之后我的代码主要是调整布局,新的页面以及页面跳转之类没有技术含量的东西就不说了,有趣的是关于按钮的background的设置,一开始是想让一个控件实现选中改变颜色,找了很多地方,大多数都是设置成按钮<Button>然后定义一个按钮的布局文件.xml在drawable中加入android:state_pressed, android:state_focused之类的东西,但是我发现就算是不可点击的控件中设置了clickable,依然没有选中的功能,只有pressed按下变色。
具体链接:改变android控件颜色_u012422855的专栏-CSDN博客
https://i.csdn.net/#/user-center/collection-list?type=1&folder=7931437&key=1
所以要么将控件直接定义成button,但是我倔强,因此我就想能不能在原有的控件上加一个透明的button,透明的button点击变色不就可以了?
事实证明是可以的,但是一开始我在button上的background设置成了@/null,虽然是透明的,但是没有办法实现我的需求,可能是@/null不能实现点击还是setbackgroundcolor还是什么原因吗我也没研究,换成了
android:background="@color/transparent"
搞定了。。。但是没有完全搞定
按钮需要添加flag来判断当前是选中的还是没有选中的,一个按钮选中了之后要把其他按钮设置回原来的颜色,按钮第二次点击要重置回原来的颜色,我一共就两个按钮,不上不下的也不太想为这两个添加一个list,想了想还是打算换个方法,添加了一个延时,让按钮在0.2秒之类改变颜色,然后恢复透明,由于我改变的只是按钮本身的颜色没有setTextColor,但是我的颜色很深接近黑色,反正0.2秒你能看得清个鬼,效果ok了。
else if (v.equals(aboutUsEnterBtn)) { aboutUsEnterBtn.setBackgroundColor(Color.parseColor("#141414")); new Thread() { @Override public void run() { super.run(); try { Thread.sleep(200);//休眠0.2秒 doActivity(AboutUsActivity.class); aboutUsEnterBtn.setBackgroundColor(Color.TRANSPARENT); baseActivity.finish(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start();
Databinding也简单的说一下,项目的代码将页面的java部分分为model和activity两个部分,在model中要
public MainModel(BaseActivity baseActivity) { super(baseActivity); }
public void setMainBindView(ActivityMainBinding activityMainBinding) { this.activityMainBinding = activityMainBinding;
………………………………
………………………………
………………………………
}
然后 在activity中,
public class MainActivity extends BaseActivity { private MainDataModel mainDataModel; private ActivityMainDataBinding activityMainDataBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityPersonalDataBinding = ActivityPersonalDataBinding.inflate(getLayoutInflater()); setContentView(activityPersonalDataBinding.getRoot()); personalDataModel = new PersonalDataModel(this); personalDataModel.setActivityPersonalDataBinding(activityPersonalDataBinding); } public void onDestory() { super.finish();; } }
databinding实现之后的按钮基本上都会自动识别,轻轻松松就初始化完成,还是比findItemById感觉上方便很多,当然如果只有一两个控件还是直接findItemById吧,没必要找麻烦炫技。
然后还有一个自动登录的问题,可以参考Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)_lyl953147712的博客-CSDN博客
但是项目的代码是封装了的,直接使用
if (SPUtils.isLogin()) { doActivity(MainActivity.class); finish(); return; }
就直接获取权限跳转页面了,因为我的代码要涉及到退出登录,每次退出之后自动登录搞得我一度以为自己的功能有问题。
else if (v.equals(exitDrawerBtn)) { baseActivity.finish(); mainDrawerLayout.closeDrawer(GravityCompat.START); SPUtils.putIsLogin(false); doActivity(LoginActivity.class); }
其实只要调用一下设定false不让它自己自动跳就ok了。
最后是一个svn的问题,因为没有在安装android的时候绑定svn搞得提交代码的时候出错了,尴尬,而且给别人也带来了麻烦,
Android studio使用SVN提交项目代码_龙旋的博客-CSDN博客_android studio svn提交代码
可以参考这个来配置android studio的svn配置,
简单来说要取消勾选下面两个, 在地址栏写自己的svn 的bin的地址,安装svn 的时候要将所有的都勾选上,然后一般来说没什么问题了。
才刚刚开始踏上蛮长的android学习啊。。。