更有效地使用findViewById

时间:2010-11-26 12:52:31

标签: java android

我目前正在使用以下代码并想知道是否有更有效的方法通过函数执行此操作?

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

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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 :(得分: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是一项非常昂贵的操作(与访问成员变量相比),因为您只需要调用一次创建应用程序时(这也考虑了方向更改,因为活动被销毁并再次重新创建)。

它非常干净整洁。内联if-expression对于这种函数非常有用,你只有那个或那个。

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

因此,不是将变量保存为要传递给函数的值,而是可以内联完成。

修改 哦,顺便说一句:请不要将08用于View.setVisibility(...)方法。这是一种非常糟糕的做法,如果将来价值发生变化,将会破坏您的应用程序。 View.VISIBLE已经是public static final int,这意味着编译器会将所有View.VISIBLE替换为0。在字节代码中它与使用0相同,没有性能影响,但如果要更改该值,所有更改将在编译时使用新SDK自动进行,并且不需要手动修改,而与您的尝试使用新值替换每个08