android错误提示“Call requires API level 23(current min is 16)”

使用ScrollView时代码中提示如下图

 

当时图省事,照着下面的提示操作,仅仅是在方法上加了@RequiresApi(M)这个注解,以为就万事大吉了,,,,,,

 

结果,生产环境中,有用户反应应用崩溃了。最后查到是因为用户的手机是5.0及以下版本,在这个方法上报错了。唉,血的教训啊~~~

然后详细看了一下,出现这种提示的原因是:项目中配置的minSdkVersion版本是16,而setOnScrollChangeListener这个方法需要在23以上才能直接使用。其实在ScrollView中,这个方法一直都有,只是在低版本上有限制而已

 

这里解释以下:

@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误

@TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误

举个例子,某个方法中使用了api9新加入的方法,而项目设置的android:minSdkVersion=8,此时在方法上加@SuppressLint("NewApi")和@TargetApi(Build.VERSION_CODES.GINGERBREAD)都可以,以上是通用的情况。

而当你在此方法中又引用了一个api11才加入的方法时,@TargetApi(Build.VERSION_CODES.GINGERBREAD)注解的方法又报错了,而@SuppressLint("NewApi")不会报错,这就是区别。

当然,不管使用哪个注解,作用仅仅是屏蔽android lint错误,所以在方法中还要判断版本做不同的操作,比如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
}else{
    
}

 

针对setOnScrollChangeListener的解决方法:为了兼容低版本,我们需要弄一个接口把它暴露出来,这样就可以直接使用了。所以解决方法就是自定义ScrollView。

public class ObservableScrollView extends ScrollView {
    private ScrollViewListener scrollViewListener = null;

    public ObservableScrollView(Context context) {
        super(context);
    }

    public ObservableScrollView(Context context, AttributeSet attrs,
                                int defStyle) {
        super(context, attrs, defStyle);
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    //创建一个接口,用于暴露出setOnScrollChangeListener
    public interface ScrollViewListener {
        void onScrollChanged(int x, int y, int oldx, int  oldy);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(x, y, oldx, oldy);
        }
    }
}

然后在代码中使用

 

 mainActivityMainBinding.mainScrollView.setScrollViewListener(new ObservableScrollView.ScrollViewListener() {
            @Override
            public void onScrollChanged(int x, int scrollY, int oldx, int  oldy) {
                mainActivityMainBinding.mainParallax.setTranslationY(-scrollY);
                mainActivityMainBinding.title.setAlpha(scrollY/90);
            }
        });

这样就可以实现兼容了,在6.0以下版本也可以正常使用。

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值