我正在通过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,为什么,因为它甚至被使用了。
我确信有更好的方法来实现这一目标;但我希望能理解为什么这样做。
答案 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表示标记为检查电子邮件地址的文本字段。