会员服务3-3_Lib

这篇博客记录了会员服务开发中的库使用经验,包括锁屏解屏时的生命周期管理、异常处理、资源文件命名规范、自定义ActionBar、TabLayout的使用细节以及Fragment与TabLayout的交互。重点探讨了如何在不同场景下正确操作和优化应用行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是记录会员服务开发时的一些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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值