2010-11-26 2 views
3

В настоящее время я использую следующий код и задаюсь вопросом, есть ли более эффективный способ сделать это с помощью функции?Использование findViewById более эффективно

showDisplay = (LinearLayout)findViewById(R.id.display1); 
if (isA) 
{ 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 


showDisplay = (LinearLayout)findViewById(R.id.display2); 
if (isB) 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 

showDisplay = (LinearLayout)findViewById(R.id.display3); 
if (isC) 
{ showDisplay.setVisibility(0);} 
else 
{ showDisplay.setVisibility(8); } 

ответ

1

Я бы сделать это так

// Do this in your onCreate method and store the references as class member variables 
showDisplay1 = (LinearLayout)findViewById(R.id.display1); 
showDisplay2 = (LinearLayout)findViewById(R.id.display2); 
showDisplay3 = (LinearLayout)findViewById(R.id.display3); 

// Do this somehwere in your code 
showDisplay1.setVisibility(isA?View.VISIBLE:View.GONE); 
showDisplay2.setVisibility(isB?View.VISIBLE:View.GONE); 
showDisplay3.setVisibility(isC?View.VISIBLE:View.GONE); 

Для эффективности важно сохранять ссылки в качестве переменных-членов, как вызов findViewById это довольно дорогое действие (по сравнению с доступом к переменной-члену), потому что вам когда-нибудь понадобится только один раз вызвать его при создании приложения d (это также объясняет изменения ориентации, так как активность уничтожается и снова воссоздается).

И это довольно чисто и аккуратно. Встроенные if-выражения очень полезны для таких функций, где у вас есть только то или это.

myFunction((expression)?if_value:else_value); 

краткость

int value = 0; 
if(expression) { 
    value = if_value; 
} else { 
    value = else_value; 
} 
myFunction(value); 

вы можете в основном игнорировать (), если переменная уже булева, если вы не должны ставить скобки. Так что это будет работать нормально тоже

myFunction((someVariable>3)?View.VISIBLE:View.GONE); 

edit2:

int value = 0; 
if(somveVariable > 3) { 
    value = View.VISIBLE; 
} else { 
    value = View.GONE; 
} 
myFunction(value); 

Так вместо того, чтобы переменный для хранения значения, которое вы хотите передать в функцию, вы можете сделать это все инлайн.

Edit: О, и кстати: Пожалуйста, никогда не используйте 0 или 8 для View.setVisibility(...) метода. Это очень плохая практика и разорвет ваше приложение, если ценности когда-либо изменятся в будущем. View.VISIBLE уже есть public static final int, что означает, что компилятор заменит все вхождения View.VISIBLE на 0. В байтовом коде это то же самое, что и при использовании 0, без влияния на производительность, но если значение когда-либо будет изменено, все изменения будут автоматически выполняться во время компиляции с новым SDK, и никакая ручная модификация не понадобится, а при вашей попытке заменить все 0 и 8 новыми значениями!

+0

Прохладный, хорошо сработал. Что делать, если я хотел бы вызвать другую функцию внутри оператора if? Например. ig isA, скрыть, а также запустить другую функцию. – bebeTech 2010-11-27 12:03:40

1

Я хотел бы сделать что-то вроде этого:

public void showDisplay(int displayId, boolean show) { 
    if (show) { 
     ((LinearLayout)findViewById(displayId)).setVisibility(0); 
    } 
    else { 
     ((LinearLayout)findViewById(displayId)).setVisibility(8); 
    } 
} 

showDisplay(R.id.display1, isA); 
showDisplay(R.id.display2, isB); 
showDisplay(R.id.display3, isC); 

код становится более удобным для чтения, а не более эффективным.

2

Обычно у меня есть куча помощников для настройки общих свойств, таких как видимость, текст и т. Д. Это делает код более красивым.

setChildVisibility(R.id.display1, isA); 
setChildVisibility(R.id.display2, isB); 
setChildVisibility(R.id.display3, isC); 

С хелперов существа:

protected void setChildVisibility(int id, boolean visible) { 
    View view = findViewById(id); 
    if (view != null) { 
     view.setVisibility(visible?View.VISIBLE:View.GONE); 
    } 
} 
Смежные вопросы