2010-11-26 68 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); 

因此,而不是使一個變量來保存要傳遞給函數的值,你可以做到這一切的內聯。

編輯: 哦,順便說一句:請千萬不要用08View.setVisibility(...)方法。這是一種非常糟糕的做法,如果價值觀未來發生變化,將會破壞您的申請。 View.VISIBLE已經是public static final int,這意味着編譯器將用0替換所有出現的View.VISIBLE。在字節碼中,與使用0相同,沒有性能影響,但如果該值有變化,所有更改將在編譯時自動發生,並且不需要手動修改,而對於您的嘗試,您將擁有用新值替換每一個08

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