IoC之手写运行时注入布局

眉间皱痕 提交于 2020-01-11 23:44:47

系列文章

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!