Android扩展Button类添加自定义方法时提示需继承AppCompatButton如何解决?
问题解决说明
提示原因
Android Studio弹出该提示是因为当前官方推荐使用androidx.appcompat.widget.AppCompatButton替代原生android.widget.Button作为自定义按钮控件的父类:AppCompatButton已经做了全Android版本的特性兼容(比如低版本的色调适配、属性支持等),能保证你的自定义按钮在不同系统版本上表现一致,该提示仅为优化建议,不影响代码运行,但更建议按提示修改父类提升兼容性。
你的代码现存问题
- 仅实现了单参数构造方法,如果你要在XML布局中使用该自定义控件,会因为缺少带
AttributeSet参数的构造方法直接崩溃 - 闪烁逻辑中
TimerTask运行在工作线程,直接调用setTextColor修改UI会抛出线程异常 - 每次闪烁循环都新建
Timer实例,资源消耗高,也容易引发内存泄漏 - 重载方法中传
Button参数的逻辑其实没有必要,自定义控件内部可以直接操作自身实例,不需要额外传参
修改后的完整代码
package com.its.me; import android.content.Context; import android.graphics.Color; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import androidx.appcompat.widget.AppCompatButton; // 类名首字母大写符合Java规范 public class FlickerButton extends AppCompatButton { private final Handler mainHandler = new Handler(Looper.getMainLooper()); // 补全所有必要构造方法 public FlickerButton(Context context) { super(context); } public FlickerButton(Context context, AttributeSet attrs) { super(context, attrs); } public FlickerButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } // 无需传Button参数,直接操作当前控件实例 public void flicker_with_current_color(String color_to_flicker, String color_to_switch_back_to, int time_interval, int times_to_flicker){ for(int i=0; i<times_to_flicker; i++){ mainHandler.postDelayed(() -> setTextColor(Color.parseColor(color_to_flicker)), (long) i * time_interval * 2); mainHandler.postDelayed(() -> setTextColor(Color.parseColor(color_to_switch_back_to)), (long) (i * time_interval * 2 + time_interval)); } } public void flicker_with_current_color(int total_time, int times_to_flicker, String color_to_flicker, String color_to_switch_back_to){ int time_interval = total_time / times_to_flicker; flicker_with_current_color(color_to_flicker, color_to_switch_back_to, time_interval, times_to_flicker); } }
使用方法
布局中使用
直接在XML布局中用自定义控件的全类名替代原来的Button标签即可:
<com.its.me.FlickerButton android:id="@+id/flicker_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="闪烁按钮"/>
代码中调用
在任意Activity/Fragment中找到该控件实例后,直接调用自定义方法即可:
FlickerButton flickerBtn = findViewById(R.id.flicker_btn); // 直接调用自定义闪烁方法 flickerBtn.flicker_with_current_color("#FF0000", "#000000", 500, 3);
该自定义控件可在所有页面复用,不需要重复编写逻辑。
内容的提问来源于stack exchange,提问作者The Amateur Coder
相关产品推荐
相关产品推荐

