由于我厌倦了为返回原始Activity.findViewById()
的每个View
编写一个强制转换操作符,所以我终于尝试了one way that was suggested by Internet。
public abstract class MyActivity extends Activity {
@SuppressWarnings("unchecked")
protected <T extends View> T findViewByID(int id) {
return (T) this.findViewById(id);
}
}
注意这不会重载(最后一个“D”是大写的)。编译器说我们无法将View
强制转换为T
。我的实施有什么问题吗?奇怪的是,这个建议很难在英文网站上看到(例如,甚至在我们可爱的Stack Overflow中),例外是上面发布的网站。
答案 0 :(得分:4)
这在我的测试项目中运行良好。没有编译器错误:
答案 1 :(得分:2)
老实说,这种方法为下一个Android维护者(他们习惯于使用转换方法)增加了一些微妙的复杂性开销,以便在代码文件中保存一些字符。
我建议以传统方式投射视图,或选择像Roboguice这样的基于反射的解决方案。
答案 2 :(得分:0)
我通过使用自定义eclipse构建器解决了这个问题,该构建器生成了包含每个布局文件的引用的类,因为:
在我看来,这是解决这个问题最干净,最高效的方法。
请在此处查看我的要点:https://gist.github.com/fab1an/10533872
布局:test.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text1" />
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="350px"
android:layout_below="@id/text2"
android:layout_marginTop="50px" />
</merge>
用法:TestView.java
public final class TestView extends RelativeLayout {
//~ Constructors ---------------------------------------------------------------------------------------------------
private final ViewRef_test v;
public TestView(final Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.test, this, true);
this.v = ViewRef_test.create(this);
this.v.text1.setText();
this.v.scroll.doSomething();
}
}
生成的文件(在gen/
中):ViewRef_test.java
package org.somecompany.somepackage;
import android.view.*;
import android.widget.*;
import java.lang.String;
@SuppressWarnings("unused")
public final class ViewRef_test {
public final TextView text1;
public final TextView text2;
public final ScrollView scroll;
private ViewRef_test(View root) {
this.text1 = (TextView) root.findViewById(R.id.text1);
this.text2 = (TextView) root.findViewById(R.id.text2);
this.scroll = (ScrollView) root.findViewById(R.id.scroll);
}
public static ViewRef_test create(View root) {
return new ViewRef_test(root);
}
}