在Android开发中,最常见的代码莫过于findViewById,通过findViewById来引用资源文件的view,但是资源文件的view过多会导致做很多重复性的工作,代码很冗余,开发效率随之下降。为了解决这个问题,目前有很多流行的开源库通过注解的方式来加载view,但是使用注解势必会带来性能的损耗,而且越来越多的开发都已经转到Android Studio上了,在Studio上使用注解会有很多问题,可能导致引用的资源id无法识别。
为了减少重复书写findViewById的次数,我们可以这么来写,首先定义一个ViewUtils
public final class ViewUtils {
public static <T extends View> T findViewById(Activity activity,int resId){
return (T) activity.findViewById(resId);
}
public static <T extends View> T findViewById(View view,int resId){
return (T) view.findViewById(resId);
}
}
这里提供两种使用方式
- 创建一个BaseActivity类
public class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
}
public void initView() {
}
public <T extends View> T $(int resId){
return ViewUtils.findViewById(this,resId);
}
}
那么就可以在子类Activity中直接调用$()方法来完成对资源控件的引用,并且无需转型
public class MainActivity extends BaseActivity {
@Override
public void initView() {
setContentView(R.layout.activity_main);
TextView tvTest = $(R.id.tv_test);
Button btTest = $(R.id.bt_test);
}
}
- 创建一个BaseFragment类
public abstract class BaseFragment extends Fragment {
protected View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = initView();
return view;
}
public abstract View initView();
public <T extends View> T $(int resId){
return ViewUtils.findViewById(view,resId);
}
}
在子类Fragment类中就可以如下使用了
public class HomeFragment extends BaseFragment {
@Override
public View initView() {
view = View.inflate(getActivity(),R.layout.activity_main,null);
TextView tvTest = $(R.id.tv_test);
Button btTest = $(R.id.bt_test);
return view;
}
}
通过使用泛型,可以避免了每次都进行类型转换,很大程度的简化了代码,开发效率也随之提升了。