Android 扩展物料按钮:应该这样做吗?SavedState具有包可见性

Android 扩展物料按钮:应该这样做吗?SavedState具有包可见性,android,android-button,material-components-android,material-components,Android,Android Button,Material Components Android,Material Components,我扩展了MaterialButton,以便在单击按钮时在按钮上显示一致的加载状态,但是在实现SavedState恢复时遇到了一个小问题 我所写的进度按钮变体,禁用视图,显示动画加载微调器,可选地显示加载文本,并在启用视图时恢复之前显示的文本/状态 MaterialButton.SavedState是包私有的,因此无法从外部扩展。这不会对我的实现造成问题,因为我没有使用它扩展的“checked”字段,但它确实会提出以下问题: TLDR 延长这个材料按钮是错误的吗 如果不是,向公共回购提交PR以公

我扩展了MaterialButton,以便在单击按钮时在按钮上显示一致的加载状态,但是在实现SavedState恢复时遇到了一个小问题

我所写的进度按钮变体,禁用视图,显示动画加载微调器,可选地显示加载文本,并在启用视图时恢复之前显示的文本/状态

MaterialButton.SavedState是包私有的,因此无法从外部扩展。这不会对我的实现造成问题,因为我没有使用它扩展的“checked”字段,但它确实会提出以下问题:

TLDR

  • 延长这个材料按钮是错误的吗
  • 如果不是,向公共回购提交PR以公开储蓄状态是否合适
:1.2.0

延长这个材料按钮是错误的吗

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: