使用通用的FindViewById是一种不好的做法吗?

时间:2015-05-05 11:36:40

标签: android

情况
我有一个BaseActivity,我可以从中扩展其他活动。在 BaseActivity 中,我有一个findCastedViewById,它基本上会转换视图,然后返回它。
我之所以这样做,是因为我个人认为它总是难以投射出来。

问题
我想知道是否有任何问题缺点,我可以通过使用此方法获得任何其他使用此方法的方法。
这是BaseActivity:

BaseActivity.java

public class BaseActivity extends Activity{

  //Other stuff

  private <E extends View> E findCastedViewById(int id){
          return (E) findViewById(id);
  }

  //Other stuff
}

4 个答案:

答案 0 :(得分:3)

考虑使用 ButterKnife ,它解决了必须持续投射您的观点的问题,并为您节省了大量时间

一旦你去 butterknife ,就没有办法了回来

基本上,您使用

注释View变量

@FindView 注释,当 ButterKnife.bind(this)被调用时,它会为您找到正确的视图

这里有一小段代码,其中ButterKnife来自GitHub页面

class ExampleActivity extends Activity {
  @FindView(R.id.user) EditText username;
  @FindView(R.id.pass) EditText password;

  @OnClick(R.id.submit) void submit() {
    // TODO call server...
  }

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

您可以在here

中详细了解 ButterKnife

答案 1 :(得分:2)

正如lukaspp已经指出的那样,在SDK 26+中,不需要进行vew投射。

他们已经实现了与问题中相同的代码,只是现在是默认的findViewById()。是的,OP,您的代码很好!

答案 2 :(得分:1)

正如此answer中所述,如果您compileSdk至少是API 26,则不再需要投放视图。

答案 3 :(得分:-3)

这不仅是丑陋的,而且如果你不断重复它也是一项昂贵的操作。

如果您确定始终需要特定的派生类,则可以自由使用它。但是,我有时会发现我只需要基类View中的方法,例如setVisibility(),在这种情况下,铸造将是一种浪费。