Java CustomEditText的奇怪行为

Java CustomEditText的奇怪行为,java,android,custom-view,Java,Android,Custom View,我创建了一个自定义的EditText,以适应我的应用程序的设计。EditText应该有一个提示,当它被聚焦时,提示应该被着色并向右移动。当它不再聚焦时,提示会回到左侧,或者,如果文本被写入EditText,它会停留在右侧,只会将颜色更改回默认的提示颜色 下面是代码,它工作得非常完美: (将进一步解释LayoutWrapContentUpdater) 属性: <resources> <declare-styleable name="CustomEditText">

我创建了一个自定义的
EditText
,以适应我的应用程序的设计。
EditText
应该有一个提示,当它被聚焦时,提示应该被着色并向右移动。当它不再聚焦时,提示会回到左侧,或者,如果文本被写入
EditText
,它会停留在右侧,只会将颜色更改回默认的提示颜色

下面是代码,它工作得非常完美: (将进一步解释LayoutWrapContentUpdater)

属性:

<resources>
    <declare-styleable name="CustomEditText">
        <attr name="hintSize" format="dimension"/>
        <attr name="hintSizeFocused" format="dimension"/>
        <attr name="hint" format="string"/>
        <attr name="hintColorFocused" format="color"/>
        <attr name="hintColor" format="color"/>
        <attr name="customBackground" format="integer"/>
        <attr name="isPassword" format="boolean"/>
        <attr name="textSize" format="dimension"/>
    </declare-styleable>
</resources>
颜色和尺寸都变了,但我不能把它放在右边

EDIT2:

每次
childrenState
传递给方法时,我都会收到警告。例如:

@Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeSparseArray(childrenStates);
    }
在这里,我得到以下警告:


未选中的分配:“android.util.SparseArray”到“android.util.SparseArray”
这是因为视图id重复。看看

并将此代码添加到类中:

@Override
public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState ss = new SavedState(superState);  
    ss.childrenStates = new SparseArray();  
    for (int i = 0; i < getChildCount(); i++) {  
        getChildAt(i).saveHierarchyState(ss.childrenStates);
    }  
    return ss;
}

@Override
public void onRestoreInstanceState(Parcelable state) {
    SavedState ss = (SavedState) state;
    super.onRestoreInstanceState(ss.getSuperState());  
    for (int i = 0; i < getChildCount(); i++) {  
        getChildAt(i).restoreHierarchyState(ss.childrenStates);
    }  
}

@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
    dispatchFreezeSelfOnly(container);
}

@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
    dispatchThawSelfOnly(container);
}

static class SavedState extends BaseSavedState {
    SparseArray childrenStates;

    SavedState(Parcelable superState) {  
        super(superState);
    }

    private SavedState(Parcel in, ClassLoader classLoader) {
        super(in);
        childrenStates = in.readSparseArray(classLoader);  
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeSparseArray(childrenStates);  
    }

    public static final ClassLoaderCreator<SavedState> CREATOR
            = new ClassLoaderCreator<SavedState>() {
        @Override
        public SavedState createFromParcel(Parcel source, ClassLoader loader) {
            return new SavedState(source, loader);
        }

        @Override
        public SavedState createFromParcel(Parcel source) {
            return createFromParcel(source, null);
        }

        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }  
    };
} 
@覆盖
公共地块可在SaveInstanceState()上使用{
可包裹的超级状态=super.onSaveInstanceState();
SavedState ss=新的SavedState(超级状态);
ss.childrenStates=new SparseArray();
对于(inti=0;i
谢谢,它很有效!但有一件事仍然不起作用。我编辑了问题。您不需要在onRestoreInstanceState中添加任何其他内容来恢复子项的状态。至于警告,您可以使用以下命令忽略它:
@SuppressWarnings({“rawtypes”,“unchecked”})
谢谢!我通过删除
LayoutWrapContentUpdater.wrapContentAgain(这个)解决了提示问题
public void onRestoreInstanceState(Parcelable state) {
    SavedState ss = (SavedState) state;
    super.onRestoreInstanceState(ss.getSuperState());
    for (int i = 0; i < getChildCount(); i++) {
        getChildAt(i).restoreHierarchyState(ss.childrenStates);
    }

    if(!textField.getText().toString().isEmpty()) {
        hint.setTextSize(hintSizeFocused);
        LayoutWrapContentUpdater.wrapContentAgain(this);
        hint.setTextColor(hintColorFocused);
        ConstraintSet set = new ConstraintSet();
        set.clone(layout);
        set.clear(R.id.custom_edit_text_hint, ConstraintSet.LEFT);
        set.connect(R.id.custom_edit_text_hint, ConstraintSet.RIGHT, R.id.custom_edit_text_constraint_layout, ConstraintSet.RIGHT, dpToPx(HINT_MARGIN_SIDE));
        set.applyTo(layout);
    }
}
@Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeSparseArray(childrenStates);
    }
@Override
public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState ss = new SavedState(superState);  
    ss.childrenStates = new SparseArray();  
    for (int i = 0; i < getChildCount(); i++) {  
        getChildAt(i).saveHierarchyState(ss.childrenStates);
    }  
    return ss;
}

@Override
public void onRestoreInstanceState(Parcelable state) {
    SavedState ss = (SavedState) state;
    super.onRestoreInstanceState(ss.getSuperState());  
    for (int i = 0; i < getChildCount(); i++) {  
        getChildAt(i).restoreHierarchyState(ss.childrenStates);
    }  
}

@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
    dispatchFreezeSelfOnly(container);
}

@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
    dispatchThawSelfOnly(container);
}

static class SavedState extends BaseSavedState {
    SparseArray childrenStates;

    SavedState(Parcelable superState) {  
        super(superState);
    }

    private SavedState(Parcel in, ClassLoader classLoader) {
        super(in);
        childrenStates = in.readSparseArray(classLoader);  
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeSparseArray(childrenStates);  
    }

    public static final ClassLoaderCreator<SavedState> CREATOR
            = new ClassLoaderCreator<SavedState>() {
        @Override
        public SavedState createFromParcel(Parcel source, ClassLoader loader) {
            return new SavedState(source, loader);
        }

        @Override
        public SavedState createFromParcel(Parcel source) {
            return createFromParcel(source, null);
        }

        public SavedState[] newArray(int size) {
            return new SavedState[size];
        }  
    };
}