Android用註解代替findViewById和setContentView,註解入門
阿新 • • 發佈:2019-01-24
看到一篇文章,用註解取代fvb,https://www.2cto.com/kf/201405/302998.html
@Target
(ElementType.FIELD)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
InjectView
{
//id就是控制元件id,在某一個控制元件上使用註解標註其id
int
id()
default
-
1
;
}
public
class
MainActivity
extends
Activity
{
public
static
final
String TAG=MainActivity;
//標註TextView的id
@InjectView
(id=R.id.tv_img)
private
TextView mText;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
autoInjectAllField(
this
);
}
catch
(IllegalAccessException e) {
}
catch
(IllegalArgumentException e) {
}
if
(mText!=
null
)
mText.setText(Hello
Gavin);
}
public
void
autoInjectAllField(Activity activity)
throws
IllegalAccessException, IllegalArgumentException
{
//得到Activity對應的Class
Class
clazz=
this
.getClass();
//得到該Activity的所有欄位
Field
[]fields=clazz.getDeclaredFields();
Log.v(TAG,
fields size-->+fields.length);
for
(Field
field :fields)
{
//判斷欄位是否標註InjectView
if
(field.isAnnotationPresent(InjectView.
class
))
{
Log.v(TAG,
is injectView);
//如果標註了,就獲得它的id
InjectView
inject=field.getAnnotation(InjectView.
class
);
int
id=inject.id();
Log.v(TAG,
id--->+id);
if
(id>
0
)
{
//反射訪問私有成員,必須加上這句
field.setAccessible(
true
);
//然後對這個屬性複製
field.set(activity,
activity.findViewById(id));
}
}
}
}
程式碼很通俗易懂,一下子就可以讓人學會註解。所以借鑑他的,我寫了下,代替setContentView的註解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface LayoutId { int id() default -1; }
@LayoutId(id = R.layout.activity_main) public class MainActivity extends AppCompatActivity { private static final String TAG = "xbh"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(this.getClass().getAnnotation(LayoutId.class).id()); } }之所以想這樣做,就是為了在有base類的時候,看起來更加的清爽
子類
@LayoutId(id = R.layout.activity_main) public class MainActivity extends BaseActivity { }父類
@SuppressLint("Registered") public class BaseActivity extends AppCompatActivity{ private static final String TAG = "xbh"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(this.getClass().getAnnotation(LayoutId.class).id()); } }這樣寫,簡直美的人心醉,啥都沒有,就成功弄出了一個Activity。
解釋下註解的定義
@Target(ElementType.TYPE)
註解的使用在什麼地方主要是決定在@Targe這個元註解上作用:用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)
取值(ElementType)有:
1.CONSTRUCTOR:用於描述構造器
2.FIELD:用於描述域
3.LOCAL_VARIABLE:用於描述區域性變數
4.METHOD:用於描述方法
5.PACKAGE:用於描述包
6.PARAMETER:用於描述引數
7.TYPE:用於描述類、介面(包括註解型別) 或enum宣告