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

내가 좋아하는 그것을 할 줄은 findViewById를 호출로, 멤버 변수로 참조를 저장하는 것이 중요합니다

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

효율성를 들어이 응용 프로그램이 만들어 질 때 한 번만 호출하면되므로 (멤버 변수에 액세스하는 것에 비해) 상당히 비싼 작업입니다 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); 

그래서 그 대신 당신이 함수에 전달하려는 값을 보유하는 변수를 만드는, 당신이 그것을 할 수있는 모든 인라인.

편집 : 아, 그리고 BTW : View.setVisibility(...) 방법에 대한 0 또는 8을 사용하지 않을하시기 바랍니다. 이는 매우 나쁜 습관이며, 미래에 가치가 변하면 응용 프로그램이 중단됩니다. View.VISIBLE은 이미 public static final int입니다. 즉, 컴파일러는 View.VISIBLE의 모든 항목을 0으로 바꿉니다. 바이트 코드에서는 0을 사용하는 것과 동일하지만 성능에는 영향을 미치지 않지만 값을 변경해야하는 경우 모든 변경 사항은 새로운 SDK로 컴파일 할 때 자동으로 발생하며 수동 수정은 필요하지 않으며 시도하는 동안 모든 단일 08을 새 값으로 바꿉니다!

+0

멋지다. 잘 작동했다. if 문의 다른 함수를 호출하고 싶다면 어떻게해야합니까? 예 : ig isA, 숨기기 및 다른 기능을 실행합니다. – bebeTech

+0

이 작업을 수행 할 수도 있습니다. 정상적인'if'에서 작동하는 모든 작업이 가능합니다. – Tseng

+0

흠, 구문을 올바르게 이해할 필요가 없습니다. 나는 showDisplay1.setVisibility (isA? View.VISIBLE, functionA() ;: View.GONE)를 시도했다. – bebeTech

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); 
    } 
} 
관련 문제