Android入门Java进阶

重新学会findViewById

2016-05-25  本文已影响592人  looper1211

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

这里提供两种使用方式

  1. 创建一个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);
    }
}
  1. 创建一个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;
    }
}

通过使用泛型,可以避免了每次都进行类型转换,很大程度的简化了代码,开发效率也随之提升了。

上一篇下一篇

猜你喜欢

热点阅读