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

ので、代わりに、関数に渡す値を保持する変数を作る、あなたがそれを行うことができ、すべてのインライン。

編集: ああとところで:、View.setVisibility(...)方法のため0または8を使用することはありませんしてください。これは非常に悪い習慣であり、価値が将来変化するならば、あなたのアプリケーションを破るでしょう。 View.VISIBLEはすでにpublic static final intです。つまり、コンパイラは、View.VISIBLEのすべてを0に置き換えます。バイトコードでは0と同じですが、パフォーマンスに影響はありませんが、値を変更する場合は、新しいSDKのコンパイル時にすべての変更が自動的に行われ、手動による変更は必要ありません。毎回08を新しい値で置き換えてください!

+0

涼しく、うまくいきました。 if文の中で別の関数を呼びたい場合はどうすればいいですか?例えば。 ig isA、hideを実行し、別の関数を実行します。 – 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); 
    } 
} 
関連する問題