`
iaiai
  • 浏览: 2198125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android注解式绑定控件BindView

 
阅读更多
Android注解式绑定控件BindView

BindView.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
    int id();
    boolean click() default false;
}

AnnotateUtil.java
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.util.Log;
import android.view.View;

import java.lang.reflect.Field;

public class AnnotateUtil {
    public AnnotateUtil() {
    }

    public static void initBindView(Object currentClass, View sourceView) {
        Field[] fields = currentClass.getClass().getDeclaredFields();
        if(fields != null && fields.length > 0) {
            Field[] var6 = fields;
            int var5 = fields.length;

            for(int var4 = 0; var4 < var5; ++var4) {
                Field field = var6[var4];
                BindView bindView = (BindView)field.getAnnotation(BindView.class);
                if(bindView != null) {
                    int viewId = bindView.id();
                    boolean clickLis = bindView.click();

                    try {
                        field.setAccessible(true);
                        if(clickLis) {
                            sourceView.findViewById(viewId).setOnClickListener((View.OnClickListener)currentClass);
                        }

                        field.set(currentClass, sourceView.findViewById(viewId));
                    } catch (Exception var11) {
                        var11.printStackTrace();
                    }
                }
            }
        }

    }

    public static void initBindView(Activity aty) {
        initBindView(aty, aty.getWindow().getDecorView());
    }

    public static void initBindView(View view) {
        Context cxt = view.getContext();
        if(cxt instanceof Activity) {
            initBindView((Activity)cxt);
        } else {
            Log.d("AnnotateUtil.java", "the view don\'t have root view");
        }
    }

    @TargetApi(11)
    public static void initBindView(Fragment frag) {
        initBindView(frag, frag.getActivity().getWindow().getDecorView());
    }
}

使用方式

Activity、Fragment中:
 @BindView(id = R.id.headerlayout)
 private HeaderLayout headerLayout;

 @Override
 protected void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.acitvity_weather);

     AnnotateUtil.initBindView(this);
 }

Adapter的ViewHolder中:
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.practice.noyet.coolweather.model.County;
import com.practice.noyet.coolweather.util.AnnotateUtil;
import com.practice.noyet.coolweather.util.BindView;

public class SpinnerArrayAdapter extends SpinnerAdapter<County> {

    public SpinnerArrayAdapter(Context context) {
        super(context);
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        Holder holder;
        if (view == null) {
            view = mInflater.inflate(android.R.layout.simple_list_item_1, null);
            holder = new Holder(view);
            view.setTag(holder);
        } else {
            holder = (Holder) view.getTag();
        }

        County county = (County) getItem(position);
        holder.textView.setText(county.getCountyName());
        return view;
    }

    private class Holder {

        @BindView(id = android.R.id.text1)
        public TextView textView;

        public Holder(View view) {
            AnnotateUtil.initBindView(this, view);
        }
    }
}
分享到:
评论

相关推荐

    Android使用注解查找控件

    - 使用`@BindView(R.id.my_button)`注解,将控件ID与成员变量关联,Butter Knife会在onCreate()方法中自动执行绑定操作。 - 不需要手动调用findViewById(),降低了代码的冗余。 5. **Dagger的使用** - Dagger是...

    android注解初始化控件还有点击事件

    在Android开发中,注解(Annotation)是一种元数据,它提供了在不改变代码执行逻辑的情况下,向编译器或运行时环境提供额外信息的方式。利用注解,开发者可以简化代码,提高可读性和可维护性。本文将深入探讨如何...

    Android-ViewUtils一个简单的注解框架功能包括布局绑定控件绑定控件的点击和长按事件

    `ViewUtils`提供了一种更简洁的方式,通过注解`@BindView`,可以直接在Activity或Fragment类中绑定布局中的控件,如下所示: ```java public class MyActivity extends AppCompatActivity { @BindView(R.id.my_...

    用注解和反射写的一个绑定控件和点击事件的demo

    本示例“用注解和反射写的一个绑定控件和点击事件的demo”提供了一种创新的方式,它通过注解和反射技术来简化UI控件的绑定和点击事件处理,从而避免了频繁使用`findViewById()`方法。这一方法尤其适合于那些拥有大量...

    手写注解处理器实现Android控件注入功能

    本示例探讨的是如何通过自定义注解处理器(Annotation Processor)实现类似ButterKnife的功能,即在编译期间自动绑定控件ID,而不是在运行时。这一技术的核心在于理解Android的APT(Android Annotation Processing ...

    自定义注解bindview.zip

    当然,如果我们选择自己实现注解处理器,那么我们需要编写解析`BindView`注解的逻辑,并在运行时动态地将控件绑定到相应的字段。这通常涉及到反射和注解处理器框架,如APT(Android Processing Tool)或Dagger的...

    Android部分自定义框架

    Android自定义框架 包含: BindView注解式绑定控件 JCSlidingMenu侧滑界面控件 JCViewPager左右滑动切换屏幕控件 RoundImageView圆形ImageView JCScrollView有弹性的ScrollView等。 详情请参考源码

    黄油刀绑定控件的点击事件.rar

    总之,"黄油刀绑定控件的点击事件"是一个关于Android开发中提高代码可读性和可维护性的实践,它通过注解的方式简化了UI事件处理。同时,作者也预告了未来会分享更多的Android开发新技术,包括信息拦截技术,这为...

    编译注解实现bindView/contentView框架的Demo

    在Android开发中,我们经常需要将布局文件中的控件与Java代码中的成员变量进行绑定,以便于操作这些控件。传统的做法是通过`findViewById()`方法来查找并赋值,但这种方式繁琐且容易出错。为了解决这个问题,开发者...

    Android通过注解初始化View 工具类

    在Android开发中,传统的UI组件初始化方式是通过`findViewById`方法来查找并绑定视图,但这往往会使得Activity或Fragment的代码变得冗长且不易维护。为了解决这一问题,开发者开始采用注解的方式进行View的初始化,...

    Android之实现运行时注解控件源码

    总结,运行时注解在Android开发中起着至关重要的作用,它们提供了一种声明式编程的方式,使得代码更易于理解和维护。通过自定义注解和反射机制,我们可以实现诸如自动绑定视图、事件监听等多种功能,极大地提高了...

    运行时注解实现控件注入

    在Android中,利用运行时注解实现控件注入是一种常见的优化代码、提高可维护性的技术。 控件注入是将XML布局中的UI元素自动绑定到Activity或Fragment的成员变量上,这样可以避免手动调用`findViewById()`方法,降低...

    Android中自定义实现IoC(控件注入、布局注入、事件注入)

    例如,我们可以创建一个注解`@BindView`,用于标记需要注入的控件,然后通过反射找到对应的视图并绑定到类的成员变量上。 接下来是布局注入。布局注入可以简化XML布局的使用,减少在代码中对View的查找和设置。我们...

    Android-Android中编译时注解实际运行Demo仿照ButterKnife来写的

    ButterKnife是一款著名的Android视图绑定库,它通过注解简化了UI元素的绑定,使得开发者无需手动查找和设置视图。本Demo旨在仿照ButterKnife,实现一个编译时注解的实际运行案例,帮助开发者理解编译时注解的工作...

    一个简单的注解实现 findViewById 和 setOnClickListener 的例子

    总结来说,本例子通过创建自定义注解`BindView`和`OnClick`,结合注解处理器`ViewBinderProcessor`,实现了在Android应用中简化findViewById和setOnClickListener操作的目标。这种编程模式不仅减少了手动操作,提高...

    ButterKnife 控件事件基本实现demo

    ButterKnife是一款由Jake Wharton开发的Android库,它简化了UI控件的绑定和事件处理,极大地减少了在Activity或Fragment中的样板代码。这个“ButterKnife 控件事件基本实现demo”是一个很好的学习资源,可以帮助...

    Android-Jet使用注解功能来实现去除一些重复的模板代码

    在Android领域,Jet库就是一种利用注解实现自动化处理的工具,它能够帮助我们自动初始化类的Field属性以及自动处理Intent,进一步简化了视图绑定。 首先,让我们深入了解Jet库的核心功能——Field和Method的绑定。...

    SqInject:基于getIdentifier实现的Android控件注入库

    SqInject目录一,功能说明二,接收说明三,使用范例四,工程模块说明五,版本说明一,功能说明1,使用...OnClick注解支持事件绑定public class MainActivity extends AppCompatActivity { @BindView(SqR.id.hello)

    android IOC 实现

    1. Butter Knife是一个流行的Android绑定库,通过注解实现视图注入,极大地简化了UI操作。引入Butter Knife后,我们可以在Activity或Fragment中声明UI元素,如: ```java public class MyActivity extends ...

    Android_ZTestAnnotation:在Android中使用注解的练习,Demo中有输入验证,View注入和事件绑定的。比较简单的实现,但还是比较实用

    `Android_ZTestAnnotation`项目通过注解实现了View注入,即通过注解在Activity或Fragment中直接引用布局文件中的视图控件,无需再调用`findViewById()`方法。这种方式提高了代码的可读性和可维护性。 例如,可以...

Global site tag (gtag.js) - Google Analytics