Android,查看后台选择器,执行任务的正确方法是什么?

时间:2014-02-19 11:35:32

标签: android view selector

我有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和新的视图状态。是的,我很懒啊:)怎么做?

3 个答案:

答案 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);
        }
    });