基本的Android代码 - EditText的InputType - 为什么使用按位运算符?

时间:2012-03-30 22:49:48

标签: android bit-manipulation

我正在通过YouTube上的bunch of Android tutorials工作,我希望它们现在有点过时了。我当前的位有以下代码:

tglButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        if (tglButton.isChecked()) {
            inputText.setInputType(InputType.TYPE_CLASS_TEXT | 
                                   InputType.TYPE_TEXT_VARIATION_PASSWORD);
        } else {
            inputText.setInputType(InputType.TYPE_CLASS_TEXT);
        }
    }
});

视频给出了为什么在这里使用按位运算符的问题,最高评论说:

  

每个InputType实际上只是整数。 TYPE_CLASS_TEXT是1,   和TYPE_TEXT_VARIATION_PASSWORD是128(或10000000)。

     

对它们执行按位OR:

     

00000001

     

千万

     
     

10000001

     

是129.

     

尝试输入input.setInputType(129);相反,你会发现它会起作用。 :)

为什么呢?此部分的目的是根据EditText的状态将text的类型从password切换为ToggleButton。为什么它是129,而不是128,为什么,因为它甚至被使用了。

我确信有更好的方法来实现这一目标;但我希望能理解为什么这样做。

1 个答案:

答案 0 :(得分:3)

这种类型的构造在编程中很常见。这些类型的整数有时被称为二进制标志。可以使用二进制操作快速组合和测试标志,计算机可以非常快速地执行。如果对象(此处为EditText)可以根据多个设置执行不同的操作,则使用二进制标志分配这些设置可能非常有效。 Java中的整数是32位,因此可以支持32个单独的标志,如果组合了标志,则可以支持更多的值。这里EditText被告知只是一个文本字段(TYPE_CLASS_TEXT是二进制1,也是整数1)或通过用TYPE_TEXT_VARIATION_PASSWORD(二进制10000000或整数128)标记它来成为密码字段。值上的二进制OR导致10000001,整​​数129.因此129表示密码文本字段(即,它被标记为文本和密码)。如果TYPE_CLASS_TEXT上的OR为TYPE_TEXT_VARIATION_EMAIL_ADDRESS(二进制100000,整数32),则结果为100001,整​​数33,因此33表示标记为检查电子邮件地址的文本字段。