[关闭]
@puke3615 2016-10-17T08:37:20.000000Z 字数 3922 阅读 850

快速创建测试Activity

高效开发


  1. package com.puke.template;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.LinearLayout;
  10. import android.widget.ScrollView;
  11. import android.widget.Toast;
  12. import java.lang.annotation.ElementType;
  13. import java.lang.annotation.Retention;
  14. import java.lang.annotation.RetentionPolicy;
  15. import java.lang.annotation.Target;
  16. import java.lang.reflect.Method;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. /**
  20. * Debug测试类,快速调试Demo工程<hr />
  21. * 使用姿势:<br />
  22. * 1. 新建一个子类继承该类<br />
  23. * 2. 跳转Activity: 在子类配置{@link Jump}注解, 然后在注解中配置跳转Activity的类型<br />
  24. * 3. 点击按钮触发方法: 在子类声明一个名称以"_"开头的方法(支持任意修饰符),最终生成按钮的文字便是改方法截去"_"<br />
  25. * 4. 方法参数支持缺省参数和单个参数<br />
  26. * 5. 如果是单个参数,参数类型必须是Button或Button的父类类型,当方法执行时,该参数会被赋值为该Buttom对象<br />
  27. * https://github.com/puke3615/DebugActivity<br />
  28. * <p>
  29. *
  30. * @author zijiao
  31. * @version 16/10/16
  32. */
  33. public abstract class DebugActivity extends Activity {
  34. protected static final String FIXED_PREFIX = "_";
  35. private final String TAG = getClass().getName();
  36. private final List<ButtonItem> buttonItems = new ArrayList<>();
  37. protected LinearLayout linearLayout;
  38. protected Context context;
  39. @Override
  40. protected void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. this.context = this;
  43. ScrollView scrollView = new ScrollView(this);
  44. setContentView(scrollView);
  45. this.linearLayout = new LinearLayout(this);
  46. this.linearLayout.setOrientation(LinearLayout.VERTICAL);
  47. scrollView.addView(linearLayout);
  48. try {
  49. resolveConfig();
  50. createButton();
  51. } catch (Throwable e) {
  52. error(e.getMessage());
  53. }
  54. }
  55. private void createButton() {
  56. for (ButtonItem buttonItem : buttonItems) {
  57. linearLayout.addView(buildButton(buttonItem));
  58. }
  59. }
  60. protected View buildButton(final ButtonItem buttonItem) {
  61. final Button button = new Button(this);
  62. button.setText(buttonItem.name);
  63. button.setOnClickListener(new View.OnClickListener() {
  64. @Override
  65. public void onClick(View v) {
  66. if (buttonItem.target != null) {
  67. to(buttonItem.target);
  68. } else {
  69. Method method = buttonItem.method;
  70. method.setAccessible(true);
  71. Class<?>[] parameterTypes = method.getParameterTypes();
  72. int paramSize = parameterTypes.length;
  73. switch (paramSize) {
  74. case 0:
  75. try {
  76. method.invoke(DebugActivity.this);
  77. } catch (Throwable e) {
  78. e.printStackTrace();
  79. error(e.getMessage());
  80. }
  81. break;
  82. case 1:
  83. if (parameterTypes[0].isAssignableFrom(Button.class)) {
  84. try {
  85. method.invoke(DebugActivity.this, button);
  86. } catch (Throwable e) {
  87. e.printStackTrace();
  88. error(e.getMessage());
  89. }
  90. break;
  91. }
  92. default:
  93. error(method.getName() + "方法参数配置错误.");
  94. break;
  95. }
  96. }
  97. }
  98. });
  99. return button;
  100. }
  101. private void resolveConfig() {
  102. Class<?> cls = getClass();
  103. //读取跳转配置
  104. if (cls.isAnnotationPresent(Jump.class)) {
  105. Jump annotation = cls.getAnnotation(Jump.class);
  106. for (Class<? extends Activity> activityClass : annotation.value()) {
  107. buttonItems.add(buildJumpActivityItem(activityClass));
  108. }
  109. }
  110. //读取方法
  111. for (Method method : cls.getDeclaredMethods()) {
  112. handleMethod(method);
  113. }
  114. }
  115. protected void handleMethod(Method method) {
  116. String methodName = method.getName();
  117. if (methodName.startsWith(FIXED_PREFIX)) {
  118. methodName = methodName.replaceFirst(FIXED_PREFIX, "");
  119. ButtonItem buttonItem = new ButtonItem();
  120. buttonItem.method = method;
  121. buttonItem.name = methodName;
  122. buttonItems.add(buttonItem);
  123. }
  124. }
  125. protected ButtonItem buildJumpActivityItem(Class<? extends Activity> activityClass) {
  126. ButtonItem buttonItem = new ButtonItem();
  127. buttonItem.name = "跳转到" + activityClass.getSimpleName();
  128. buttonItem.target = activityClass;
  129. return buttonItem;
  130. }
  131. public void L(Object s) {
  132. Log.i(TAG, s + "");
  133. }
  134. public void error(String errorMessage) {
  135. T("[错误信息]\n" + errorMessage);
  136. }
  137. public void T(Object message) {
  138. Toast.makeText(context, String.valueOf(message), Toast.LENGTH_SHORT).show();
  139. }
  140. public void to(Class<? extends Activity> target) {
  141. try {
  142. startActivity(new Intent(this, target));
  143. } catch (Exception e) {
  144. e.printStackTrace();
  145. error(e.getMessage());
  146. }
  147. }
  148. public void T(String format, Object... values) {
  149. T(String.format(format, values));
  150. }
  151. @Target(ElementType.TYPE)
  152. @Retention(RetentionPolicy.RUNTIME)
  153. public @interface Jump {
  154. Class<? extends Activity>[] value() default {};
  155. }
  156. protected static class ButtonItem {
  157. public String name;
  158. public Method method;
  159. public Class<? extends Activity> target;
  160. }
  161. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注