这是记录会员服务开发时的一些Lib,仅供再次翻阅。
1.锁屏,解屏时的生命周期
在做指纹解锁时,需要判定当前的屏幕状态是不是锁屏。
按照我的理解,指纹解锁应该是传感器,使用它需要获取Authenticate。当锁屏的状态下,需要两次指纹解锁,锁屏到开屏时的指纹解锁,以及我们程序的指纹解锁。但是如果这个Authenticate被系统获取,那么软件中需要重新获取;如果Authenticate被软件获取,系统就不能用指纹开锁。所以监听了屏幕状态,在锁屏时释放Authenticate,解屏时获取Authenticate。
关于锁屏解屏时的生命周期可看这篇文章:关于锁屏和回到桌面的activity生命周期的疑问
在onPause() 和 onResume() 方法中分别释放Authenticate和获取Authenticate。
2.异常
异常信息:Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
错误原因:在adapter中设计点击Intent跳转activity事件,传入的Context不是activity的context
解决办法:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
FLAG_ACTIVITY_NEW_TASK:默认的跳转类型,它会重新创建一个新的Activity,不过与这种情况,比如说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.
3.tips
一个项目,有很多module,或者lib,或者aar引用,记得使用的资源文件名,特别是layout,mipmap,drawable文件名,不要重名。
否则就会出现,多module时,依赖包加载的仍是主module的资源
4.actionBar相关
actionBar有一个setCustomView( int layoutId )函数,用于自定义actionbar样式。注意下高度和侧边。
5.tablayout
( 1 ) 改变选中不同tab时的背景颜色
tablayout改变字体颜色倒是方便,动态改变背景颜色确实有点麻烦
首先定义一个drawable
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/mem_tab_select" android:state_selected="true" />
<item android:drawable="@drawable/mem_tab_unselect" android:state_focused="false" android:state_selected="false" />
</selector>
其次,定义drawable/mem_tab_select
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#0b0b0c" />
</shape>
其次,在style文件中设置以下格式:
<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
<item name="tabBackground">@drawable/mem_tab_bg</item>
<item name="tabIndicatorHeight">0dp</item>
</style>
最后,代码中setupWithViewPager后,执行以下方法:
for (int i = 0; i < titles.length; i++) {
tab.getTabAt(i).setText(titles[i]);
}
for (int i = 0; i < tab.getTabCount(); i++) {
TabLayout.Tab tabLittle = this.tab.getTabAt(i);
if (tabLittle != null) {
tabLittle.setCustomView(getTabView(i));
}
}
上面代码片中的getTabView()方法如下:
private View getTabView(int pos) {
View view = LayoutInflater.from(HomeMainActivity.this).inflate(R.layout.mem_tab, null);
TextView tv = ((TextView) view.findViewById(R.id.mem_tab_txt));
tv.setText(titles[pos]);
ImageView image = ((ImageView) view.findViewById(R.id.mem_tab_pic));
image.setImageDrawable(drawable);
return view;
}
( 2 ) 在子fragment中获取父activity的控件的问题
首先,父activity定义一个方法
public TabLayout getTab() {
return tab;
}
其次,子fragment获取activity(注意判断是否为空以及是否是父activity类型)
if (getActivity() != null && getActivity() instanceof HomeMainActivity) {
TabLayout tab = ((HomeMainActivity) getActivity()).getTab();
}
( 3 )子fragment监听tablayout的切换
此处在项目中的需求是,当切换tab后,当前fragment正在播放的音频停止;
由于viewpager中只有三个fragment,viewpager切换fragment的时候不能重走生命周期【重走的话相当于重新加载,那么这个viewpager负担的也太重了】,因此只能从tablayout下手。
tablayout提供了一个回调:addOnTabSelectedListener
tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (tab.getPosition() == 2) {
//当前tab(位于第三个的位置)被选中
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
if (tab.getPosition() == 2) {
//选中了其他tab,调用这个回调后切换tab
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
6.tips
(1)在Library文件中不可使用 switch( view.getId() ) 方法
(2)TextView中字段间的行距间距设置:
android:lineSpacingExtra
android:lineSpacingMultiplier。