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];
}
};
}