注解小结--实例--findViewById和Click点击事件

原创 2018年04月16日 16:07:24

最近来到一家新公司, 公司的项目用到了很多第三方框架, 比如Retrofit, ButterKnife, EventBus等等, 里面很多地方都用到了注解.现在项目上线了, 闲来无事, 也随手写一下类似于ButterKnife的功能, 就以findViewById和Onclick事件为内容, 利用注解实现其功能. 下面闲话少说, 上代码~~~~~~


首先创建一个关于findViewById的注解类. 基本形式@interface.

为了实现注解能够存活且在jvm中运行需要加上元注解@Retention(RetentionPolicy.RUNTIME).

package com.example.chanp.testannotation.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Created by sjx on 2018/4/16.
 */

@Retention(RetentionPolicy.RUNTIME)
public @interface FindId {
    int value() default 0;
}

创建一个OnClick的注解类

package com.example.chanp.testannotation.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Created by sjx on 2018/4/16.
 */

@Retention(RetentionPolicy.RUNTIME)
public @interface FindClick {
    int id() default 0;
}

测试用的Activity

package com.example.chanp.testannotation;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.chanp.testannotation.annotation.AnnotationHelper;
import com.example.chanp.testannotation.annotation.FindClick;
import com.example.chanp.testannotation.annotation.FindId;

/**
 * Created by sjx on 2018/4/16.
 */

public class TestActivity extends AppCompatActivity implements View.OnClickListener{

    @FindId(R.id.text_1)
    TextView text_1;
    @FindId(R.id.text_2)
    TextView text_2;

    TextView text_3;

    @FindClick(id=R.id.text_onclick)
    TextView text_onclick;

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

        AnnotationHelper.getInstance().init(this);

        if (text_1 != null){
            text_1.setText(this.getClass().getSimpleName()+" onCreate text_1");
        }

        if (text_2 != null){
            text_2.setText(this.getClass().getSimpleName()+" onCreate text_2");
        }

    }

    public void onClick(View view){
        switch (view.getId()){
            case R.id.text_onclick:
                Toast.makeText(this, "text_onclick Onclick...", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="22dip"
        android:textSize="20sp"/>

    <TextView
        android:id="@+id/text_2"
        android:layout_marginTop="20dip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text_3"
        android:layout_marginTop="20dip"
        android:text="text_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text_onclick"
        android:layout_marginTop="20dip"
        android:text="Onclick"
        android:padding="10dip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

下面就是注解的读取, 注解提取和处理, 是给编译器和APT(Annotation Processing Tool)用的.

下面就是利用反射读取值,并且赋值的过程.

package com.example.chanp.testannotation.annotation;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;

import java.lang.reflect.Field;

/**
 * Created by sjx on 2018/4/16.
 */

public class AnnotationHelper {
    private static final String TAG = "AnnotationHelper";
    private static class InstanceHelper{
        public static final AnnotationHelper instance = new AnnotationHelper();
    }

    public static AnnotationHelper getInstance(){
        return InstanceHelper.instance;
    }

    public void init(Activity ctx){
        Class clzz = ctx.getClass();
        Field[] fields = clzz.getDeclaredFields();
        for (Field field : fields){
            field.setAccessible(true);

            if (field.isAnnotationPresent(FindId.class)){ //参数
                FindId findId = field.getAnnotation(FindId.class);
                Log.i(TAG, "field name : " + field.getName() + "   value : " + findId.value());

                try {
                    field.set(ctx, ctx.findViewById(findId.value()));

                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

            if (field.isAnnotationPresent(FindClick.class)){
                FindClick findClick = field.getAnnotation(FindClick.class);
                try {
                    Log.i(TAG, "field name : " + field.getName() + "   value : " + findClick.id());
                    View view = ctx.findViewById(findClick.id());
                    view.setOnClickListener((View.OnClickListener) ctx);
                    field.set(ctx, view);


                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

然后赋值和点击事件就出来了~

效果图:

   


随手一写, Mark一下.

Java注解

-
  • 1970年01月01日 08:00

自定义注解实战,自己写一个FindViewById注解

前言 在开发过程中,我们肯定会用到各种三方框架。在安卓开发中,有很多我们国人编写的优秀框架,Afinal,Zfinnal,Xutils等。这些框架功能非常强大。这里我们来说一下主题,在这些框架中我们可...
  • JingbinChow
  • JingbinChow
  • 2017-03-29 13:04:29
  • 525

Android 注解findViewById、onClick

1.定义控件对象注解字段类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import...
  • u012127961
  • u012127961
  • 2017-04-16 15:20:22
  • 437

Android 注解的简单使用之省去findViewById()

Android开发中不可避免的是findViewById()这样的繁琐事情,往往我们在写这些findViewById()的的时候有没有种想吐的感觉?这项工作纯属是个没营养的体力活,so Android...
  • richardli1228
  • richardli1228
  • 2016-04-18 17:45:52
  • 2202

自定义注解,告别findViewById,你只需要这样做

传统的项目中,为了从XML文件找到各个控件,findViewById,是不得不去写的代码,以致于太多的控件,太多的findViewId,使我们的代码变得繁琐,获取,强转,千篇一律的重复着某种机制,其实...
  • ming_147
  • ming_147
  • 2017-03-14 15:13:52
  • 1207

安卓通过注解+反射简单实现代替findViewById方法

注解+反射 框架
  • oDaBenNiu
  • oDaBenNiu
  • 2016-11-29 15:55:45
  • 773

Android使用注解避免大量的findViewById()

Android使用注解避免大量的findViewById()
  • qq_15771061
  • qq_15771061
  • 2016-05-24 17:18:21
  • 1291

Android中通过注解代替findViewById方法

这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一个注解 注解的概念是在jdk5.0中提出来的,在java.lang的包中已经定义了三个注解...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2014-05-21 20:50:42
  • 2906

Android高效率编码-findViewById()的蜕变-注解,泛型,反射

Android高效率编码-finViewById()的蜕变-注解,泛型Android的老朋友findViewById()篇! 先看看他每天是在干什么 //好吧,很多重复的,只不过想表达项目里确实...
  • qq_26787115
  • qq_26787115
  • 2015-12-16 23:14:28
  • 2665

自定义注解, 完美代替findViewById()

一、声明 /**自定义注解ViewRoot*/ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) ...
  • u010291868
  • u010291868
  • 2017-05-04 13:14:02
  • 140
收藏助手
不良信息举报
您举报文章:注解小结--实例--findViewById和Click点击事件
举报原因:
原因补充:

(最多只允许输入30个字)