IoC之手写运行时注入布局

系列文章

IoC之手写运行时注入布局
IoC之手写运行时注入控件
IoC之手写运行时注入点击事件
IoC之手写运行时注入通用事件

常规写法

public class MainActivity extends AppCompatActivity {

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

所谓运行时注解,就是在代码中没有写setContentView(xxx),而是在运行的时候调用的。

运行时注入

首先我们需要一个注解,用来获取注入布局的id

@Target(ElementType.TYPE) // 注解作用域到 类上
// @Retention(RetentionPolicy.CLASS) // 编译时期
@Retention(RetentionPolicy.RUNTIME) // 运行时期
public @interface ContentView {

    int value() default -1;

}

然后我们使用一个工具类,来解析这个注解,并且通过反射调用setContentView方法。

/**
     * 把布局注入到 Activity中去
     * @param object == MainActivity
     */
    private static void injectSetContentView(Object object) {

        Class<?> mMainActivityClass = object.getClass();

        // 拿到MainActivity里面的(ContentView)注解
        ContentView mContentView = mMainActivityClass.getAnnotation(ContentView.class);

        if (null == mContentView) {
            Log.d(TAG, "ContentView is null ");
            return;
        }

        // 拿到用户设置的布局ID
        int layoutID = mContentView.value();

        // 我们需要执行 setContentView(R.layout.activity_main); 把布局注入到Activity
        try {
            Method setContentViewMethod = mMainActivityClass.getMethod("setContentView", int.class);
            setContentViewMethod.invoke(object, layoutID);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最后在Activity中调用即可


@ContentView(R.layout.activity_main) // 5415151
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        InjectTool.inject(this);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值