Базовый код Android - InputType EditText - почему был использован побитовый оператор? - PullRequest
0 голосов
/ 31 марта 2012

Я пробираюсь через кучу учебных пособий по Android на YouTube, я думаю, что они уже немного устарели. Бит, который я сейчас использую, имеет следующий код:

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

Видео показывает, почему здесь используется побитовый оператор, и в верхнем комментарии говорится, что:

Каждый из типов ввода на самом деле является целым числом. TYPE_CLASS_TEXT равно 1, и TYPE_TEXT_VARIATION_PASSWORD равно 128 (или 10000000).

Выполнить побитовое ИЛИ для них:

00000001

10000000


10000001

, что составляет 129.

Попробуйте ввести input.setInputType (129); вместо этого вы увидите, что это сработает. :)

Почему? Целью этой части является переключение типа EditText с text на password в зависимости от состояния ToggleButton. Почему это 129, а не 128, и почему, в этом отношении это даже используется.

Я уверен, что есть лучший способ достичь этого; но я надеюсь понять, почему это было сделано так.

1 Ответ

3 голосов
/ 31 марта 2012

Этот тип конструкции распространен в программировании.Этот тип целых чисел иногда называют двоичными флагами.Флаги можно быстро комбинировать и тестировать с помощью бинарных операций, которые компьютеры могут выполнять очень быстро.Если объект (в данном случае EditText) может работать по-разному в зависимости от нескольких настроек, назначение этих настроек с помощью двоичных флагов может быть эффективным.Целое число в Java - 32 бита, поэтому могут поддерживаться 32 отдельных флага и много других значений, если флаги объединены.Здесь сообщается, что EditText должен быть либо текстовым полем (TYPE_CLASS_TEXT - это двоичное 1, которое также является целым числом 1), либо стать полем пароля, пометив его TYPE_TEXT_VARIATION_PASSWORD (двоичный код 10000000 или целое число 128).Двоичное ИЛИ для значений приводит к 10000001, целому числу 129. Таким образом, 129 представляет текстовое поле пароля (т. Е. Оно помечено как текст и пароль).Если это было ИЛИ для TYPE_CLASS_TEXT с TYPE_TEXT_VARIATION_EMAIL_ADDRESS (двоичный код 100000, целое число 32), результатом будет 100001, целое число 33, поэтому 33 представляет текстовое поле, помеченное для проверки адреса электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...