Android 扩展物料按钮:应该这样做吗?SavedState具有包可见性
我扩展了MaterialButton,以便在单击按钮时在按钮上显示一致的加载状态,但是在实现SavedState恢复时遇到了一个小问题 我所写的进度按钮变体,禁用视图,显示动画加载微调器,可选地显示加载文本,并在启用视图时恢复之前显示的文本/状态 MaterialButton.SavedState是包私有的,因此无法从外部扩展。这不会对我的实现造成问题,因为我没有使用它扩展的“checked”字段,但它确实会提出以下问题: TLDRAndroid 扩展物料按钮:应该这样做吗?SavedState具有包可见性,android,android-button,material-components-android,material-components,Android,Android Button,Material Components Android,Material Components,我扩展了MaterialButton,以便在单击按钮时在按钮上显示一致的加载状态,但是在实现SavedState恢复时遇到了一个小问题 我所写的进度按钮变体,禁用视图,显示动画加载微调器,可选地显示加载文本,并在启用视图时恢复之前显示的文本/状态 MaterialButton.SavedState是包私有的,因此无法从外部扩展。这不会对我的实现造成问题,因为我没有使用它扩展的“checked”字段,但它确实会提出以下问题: TLDR 延长这个材料按钮是错误的吗 如果不是,向公共回购提交PR以公
- 延长这个材料按钮是错误的吗
- 如果不是,向公共回购提交PR以公开储蓄状态是否合适
MaterialButton
不是最终类,那么您可以扩展它,例如ExtendedFloatingActionButton
扩展它
如果不是,向公共回购提交PR以公开储蓄状态是否合适
您不需要将MaterialButton.SavedState
设置为公共。您可以执行以下操作:
public class MyButton extends MaterialButton
{
private String text;
//....
static class SavedState extends AbsSavedState {
@Nullable CharSequence myText;
SavedState(Parcelable superState) {
super(superState);
}
SavedState(@NonNull Parcel source, ClassLoader loader) {
super(source, loader);
myText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
super.writeToParcel(dest, flags);
TextUtils.writeToParcel(myText, dest, flags);
}
@NonNull
@Override
public String toString() {
return "MyButton.SavedState{"
+ " text="
+ myText
+ "}";
}
public static final Creator<SavedState> CREATOR =
new ClassLoaderCreator<SavedState>() {
@NonNull
@Override
public SavedState createFromParcel(@NonNull Parcel in, ClassLoader loader) {
return new SavedState(in, loader);
}
@Nullable
@Override
public SavedState createFromParcel(@NonNull Parcel in) {
return new SavedState(in, null);
}
@NonNull
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
@Nullable
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.myText = text;
return ss;
}
@Override
public void onRestoreInstanceState(@Nullable Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
text = ss.myText.toString();
}
}
公共类MyButton扩展了MaterialButton
{
私有字符串文本;
//....
静态类SavedState扩展了AbsSavedState{
@可为空的字符序列myText;
保存状态(可包裹的超级状态){
超级(超级国家);
}
SavedState(@NonNull地块源,类加载器){
超级(源、加载程序);
myText=TextUtils.CHAR\u SEQUENCE\u CREATOR.createFromParcel(源代码);
}
@凌驾
公共无效writeToParcel(@NonNull Parcel dest,int标志){
超级可写包裹(目的地、旗帜);
TextUtils.writeToParcel(myText、dest、标志);
}
@非空
@凌驾
公共字符串toString(){
返回“MyButton.SavedState{”
+“文本=”
+我的文本
+ "}";
}
公共静态最终创建者=
新的ClassLoaderCreator(){
@非空
@凌驾
public SavedState createFromParcel(@NonNull Parcel-in,ClassLoader){
返回新的SavedState(in,loader);
}
@可空
@凌驾
public SavedState createFromParcel(@NonNull Parcel-in){
返回新的SavedState(in,null);
}
@非空
@凌驾
public SavedState[]新数组(整数大小){
返回新的SavedState[大小];
}
};
}
@可空
@凌驾
公共地块可在SaveInstanceState()上使用{
可包裹的超级状态=super.onSaveInstanceState();
SavedState ss=新的SavedState(超级状态);
ss.myText=文本;
返回ss;
}
@凌驾
公共无效onRestoreInstanceState(@Nullable Parcelable state){
如果(!(保存状态的状态实例)){
super.onRestoreInstanceState(状态);
返回;
}
SavedState ss=(SavedState)状态;
super.onRestoreInstanceState(ss.getSuperState());
text=ss.myText.toString();
}
}
这样,MyButton.SavedState
也将包含MaterialButton.SaveState
而不扩展它
精彩的回答,简洁而详细,谢谢加布里埃尔:+1: