Android 使用通用FindViewById是一种糟糕的做法吗?

Android 使用通用FindViewById是一种糟糕的做法吗?,android,Android,形势 我有一个BaseActivity,从中我扩展了其他活动。在BaseActivity中,我有一个findCastedViewById,基本上我会强制转换视图,然后返回它 我这样做是因为,就我个人而言,我觉得一直在拍摄风景很难看 问题 我想知道是否有任何问题或缺点,我可以从使用此方法的任何其他人那里得到。 以下是基本活动: BaseActivity.java 公共类BaseActivity扩展活动{ //其他东西 私有E-findCastedViewById(内部id){ 返回(E)find

形势
我有一个BaseActivity,从中我扩展了其他活动。在BaseActivity中,我有一个
findCastedViewById
,基本上我会强制转换视图,然后返回它
我这样做是因为,就我个人而言,我觉得一直在拍摄风景很难看

问题
我想知道是否有任何问题缺点,我可以从使用此方法的任何其他人那里得到。
以下是基本活动:

BaseActivity.java
公共类BaseActivity扩展活动{
//其他东西
私有E-findCastedViewById(内部id){
返回(E)findViewById(id);
}
//其他东西
}

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

一旦你走了小刀,就没有回头路了

基本上,您可以使用注释注释视图变量

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

下面是一段代码片段,其中使用了GitHub页面中的ButterKnife

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...
  }
}
你可以从

中了解更多关于巴特刀的信息。如果你不断重复,它不仅丑陋而且昂贵


如果确定始终需要该特定派生类,则可以自由使用它。但是,有时我发现我只需要基类
视图中的方法,例如
setVisibility()
,在这种情况下,强制转换是一种浪费。

如本文所述,如果
compileSdk
至少是API 26,则不需要再强制转换视图。

正如Lukasp已经指出的,在SDK 26+中,不需要vew铸造


他们实现了与问题中相同的代码,只是现在它是默认的
findViewById()
。是的,你的代码很好

不是真的,但是你可以通过使用Check it outNice question来节省很多时间并提高可读性,但这是一个从未想过的问题。如果有人有答案,我会很高兴地读到:)我只是快速浏览了一下ButterKnife,是的,它非常有用,基本上很好地解决了问题,所以+1对你来说,但这不是我想要的答案,我想知道我使用的方法的缺点!你能更新答案并解释为什么这会是一个昂贵的操作吗?@Assa这是java的常识,以前也是。因此,如果我做对了,我的方法可能会因为铸件而昂贵?首先,阅读链接上的评论:这是旧信息,现在铸件更快了。其次,问题不在泛型findView中,而是在使用具体类型中。问题是关于不能使用模糊类型的情况,因此答案是错误的。欢迎使用!这应该是一个评论,而不是回答。再重复一点。
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...
  }
}