Android解决使用findViewById时需要对返回值进行类型

在我们的开发工作时,findViewById可能是用得最多的函数之一,但它特别讨厌的地方就是我们经常需要对返回的view进行类型转换,输入麻烦、代码丑陋,例如以前我们在Activity中找一些子控件一般是这样 :

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //  查找子控件
        TextView textView = (TextView)findViewById(R.id.my_textview);
        ImageView imageView = (ImageView)findViewById(R.id.my_imageview);
        ListView listView = (ListView)findViewById(R.id.my_listview);
}

如果页面中的控件比较多,就会有很多的类型转换,这么搞下去还能不能在Android上愉快地开发项目了? 而使用ViewFinder则免去了类型转换,ViewFinder是一个在一个布局中找某个子控件的工具类,用户需要在使用时调用ViewFinder.initContentView函数来初始化ContentView,参数为Context和布局id。然后使用ViewFinder.findViewById来获取需要的view,返回的view则直接是你接收的类型,而不需要进行强制类型转换。

示例如下 :

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化
        ViewFinder.initContentView(this, R.layout.activity_main) ;
        // 查找子控件
        TextView textView = ViewFinder.findViewById(R.id.my_textview);
        ImageView imageView = ViewFinder.findViewById(R.id.my_imageview);
        ListView listView = ViewFinder.findViewById(R.id.my_listview);
}

ViewFinder的实现

/**
 * view finder, 方便查找View。用户需要在使用时调用initContentView,
 * 将Context和布局id传进来,然后使用findViewById来获取需要的view
 * ,findViewById为泛型方法,返回的view则直接是你接收的类型,而不需要进行强制类型转换.比如,
 * 以前我们在Activity中找一个TextView一般是这样 :
 * TextView textView = (TextView)findViewById(viewId);
 * 如果页面中的控件比较多,就会有很多的类型转换,而使用ViewFinder则免去了类型转换,
 * 示例如下 :
 * TextView textView = ViewFinder.findViewById(viewId);
 *
 * @author mrsimple
 */
public final class ViewFinder {

/**
    * LayoutInflater
    */
    static LayoutInflater mInflater;

/**
    * 每项的View的sub view Map
    */
    private static SparseArray<View> mViewMap = new SparseArray<View>();

/**
    * Content View
    */
    static View mContentView;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5790dd2cee3c1444b8418e43033df8b0.html