我有EditText,它可能处于3种状态:
1)启用,正确输入
2)启用,输入错误
3)已禁用
我有3个背景绘图,每个对应于每个状态。如何为每个州展示适当的抽签?我想用选择器完成这个任务。类似的东西:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/disabled"/>
<item android:state_enabled="true" android:color="@color/enbaled_correct_input"/>
</selector>
但是如何识别选择器项目,对应于“已启用,输入错误”?我还需要一个州。我可以扩展EditText,创建自定义状态并在选择器中使用它,但这似乎对我的任务来说太过分了(我只在应用程序中使用此选择器一次)。
或者,我可以在代码中调用setBackgroundResource并传递适当状态的正确背景,但这意味着拒绝选择器。我想用选择器完成这个任务,而不是扩展EditText和新的视图状态。是的,我很懒啊:)怎么做?
答案 0 :(得分:2)
创建两个不同的选择器,并以编程方式依赖于输入开关选择器。
伪:
if(mEditTextBooleanCorrect)
mEditText.setBackgroundResource(R.drawable.mySelectorCorrect)
else
mEditText.setBackgroundResource(R.drawable.mySelectorIncorrect)
编辑:在OnTextChangedListener中执行此操作
答案 1 :(得分:1)
我认为你无法通过选择器机制实现它,因为无法定义新状态并将它们绑定到选择器中的XML属性。
尽管如此,您无需扩展TextView来验证它。我们的想法是使用TextWatcher
:
txt1.addTextChangedListener(validator);
您的验证器将覆盖方法
@Override
public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
然后,validate方法可以调用setBackgroundResource,根据验证从一种颜色切换到另一种颜色。启用textview时,也应调用validate。
除了特定的状态管理之外,我还会依赖XML。
答案 2 :(得分:1)
尝试这个自定义drawable(res / drawable / et.xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="false" android:drawable="@drawable/disabled" />
<item android:state_enabled="true">
<level-list>
<item android:minLevel="0" android:maxLevel="0" android:drawable="@drawable/invalid" />
<item android:minLevel="1" android:maxLevel="1" android:drawable="@drawable/valid" />
</level-list>
</item>
</selector>
测试代码:
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
final EditText et = new EditText(this);
et.setBackgroundResource(R.drawable.et);
et.setEnabled(false);
Button b = new Button(this);
b.setText("enabled / disabled");
ll.addView(et);
ll.addView(b);
setContentView(ll);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
et.setEnabled(!et.isEnabled());
}
});
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
et.getBackground().setLevel(s.length() == 0? 0 : 1);
}
});