复合视图:无法使用 invalidat() 更改编辑文本颜色


首先,我为我糟糕的英语道歉。我对编程还很陌生,而且我很难让这个复合视图正常工作。所以我创建了两个视图的布局
  1. EditText:用于获取用户输入
  2. ImageView:用于设置EditText启用

    <EditText
    android:inputType="text"
    android:layout_width="200dp"
    android:ems="10"
    android:layout_height="50dp"
    android:id="@+id/edittext_field"/>
    <ImageView
    android:layout_height="50dp"
    android:layout_width="30dp"
    android:src="@drawable/ic_edit"
    android:id="@+id/imageview_edit"
    android:background="#7388A4"/>
    

然后我创建了EditableView类并设置了所有变量和属性。。。

public class EditableView extends LinearLayout
{
private boolean isEditable=false;
private boolean isValide=true;
private int color=0XFF000000;
private String text="this field is empty";
private int textLength;
public EditableView(Context context){
super(context);
}
public EditableView(Context context,AttributeSet attr){
super(context,attr);
TypedArray typedArray=context.obtainStyledAttributes(attr,R.styleable.EditableView);
try{
isEditable=typedArray.getBoolean(R.styleable.EditableView_setEditable,false);
isValide=typedArray.getBoolean(R.styleable.EditableView_isValide,true);
color=typedArray.getColor(R.styleable.EditableView_color,0);
text=typedArray.getString(R.styleable.EditableView_text);
}
finally{
typedArray.recycle();
}
initView(context,attr);
}
public void setEditable(boolean isEditable)
{
this.isEditable = isEditable;
}
public boolean isEditable()
{
return isEditable;
}
public void setIsValide(boolean isValide)
{
this.isValide = isValide;
}
public boolean isValide()
{
return isValide;
}
public void setColor(int color)
{
this.color = color;
}
public int getColor()
{
return color;
}
public void setText(String text)
{
this.text = text;
invalidate();
}
public String getText()
{
return text;
}

public void initView(Context context,AttributeSet attr){
LayoutInflater.from(getContext()).inflate(R.layout.custom_edit_view,this,true);
}
@Override
protected void onFinishInflate()
{
// TODO: Implement this method
super.onFinishInflate();
final EditText editableText=(EditText)findViewById(R.id.edittext_field);
ImageView editImage=(ImageView)findViewById(R.id.imageview_edit);
editableText.setText(text);
editableText.setTextColor(color);
editableText.setEnabled(isEditable);

editImage.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View p1)
{
// TODO: Implement this method
textLength=editableText.getText().length();
if(isEditable){
if(textLength<8){
isValide=false;
color=Color.RED;
}else{
isValide=true;
color=Color.BLACK;
isEditable=false;
}
}else{
isEditable=true;
}
setEditable(isEditable);
setColor(color);
editableText.postInvalidate();
}
});
}

最后,我把我的视图放在主活动布局中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top|center_horizontal"
android:id="@+id/home"
android:orientation="vertical"
android:background="#282828"
android:padding="10dp">
<com.tomouh.com.didin.recorder.customviews.EditableView
android:id="@+id/editableView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center|center_vertical"
android:padding="4dp"
android:layout_marginBottom="10dp"
app:text="some text"
app:color="#ee9900"
android:background="#FFFFFF">
</com.com.didin.recorder.customviews.EditableView>
</LinearLayout>

由于某种原因,当我按下ImageView时,即使使用invalidate((和postInvalidate(((,EditText的文本颜色也保持不变;

setColor(int color)中添加editableText.setTextColor(color);

public void setColor(int color)
{
this.color = color;
editableText.setTextColor(color);
}

最新更新