我有EditText,它可能在三个州:
1)启用,正确输入
2)启用,输入错误
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,创建自定义状态并在选择器中使用它,但是这个seemes对于我的任务来说是过分的(我只在应用程序中使用这个选择器一次)。
或者,我可以在代码中调用setBackgroundResource,并为适当的状态传递适当的背景,但这意味着拒绝选择器。我想用选择器完成这个任务,而不需要扩展EditText和新的视图状态。是的,我很懒:)怎么做?
发布于 2014-02-19 06:15:15
尝试这个自定义可绘制(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);
}
});
发布于 2014-02-19 03:42:40
以编程方式创建两个不同的选择器,并取决于输入开关选择器。
伪:
if(mEditTextBooleanCorrect)
mEditText.setBackgroundResource(R.drawable.mySelectorCorrect)
else
mEditText.setBackgroundResource(R.drawable.mySelectorIncorrect)
编辑:在OnTextChangedListener中执行此操作
发布于 2014-02-19 03:48:12
我认为您无法通过选择器机制来实现这一点,因为不可能定义新的状态并将它们绑定到选择器中的XML属性。
不过,您不需要扩展TextView来验证它。这样做的目的是使用TextWatcher
:
txt1.addTextChangedListener(validator);
验证器将覆盖方法的位置。
@Override
public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
然后,验证方法可以调用setBackgroundResource从一种颜色切换到另一种颜色,这取决于验证。启用文本视图时,也应该调用validate。
除了特定的状态管理之外,我还将依赖于XML。
https://stackoverflow.com/questions/21879283
复制