Android RoboGuice2 使用指南(3): Inject 自定义View

jerry Android 2015年08月24日 收藏

前面介绍了Android RoboGuice2 的HelloWorld示例,并介绍了从RoboGuice 1.1 升级到RoboGuice2.0 的主要注意事项。其它的基本概念和RoboGuice1.1基本一样,可以参见

  • Android RoboGuice 使用指南(3):Bindings 概述
  • Android RoboGuice 使用指南(4):Linked Bindings
  • Android RoboGuice 使用指南(5):Binding Annotations
  • Android RoboGuice 使用指南(6):Instance Bindings
  • Android RoboGuice 使用指南(7):@Provides Methods
  • Android RoboGuice 使用指南(8):Provider Bindings
  • Android RoboGuice 使用指南(9):Untargetted Bindings
  • Android RoboGuice 使用指南(10):Just-in-time Bindings
  • Android RoboGuice 使用指南(11):Scopes
  • Android RoboGuice 使用指南(12):如何绑定generic类型
  • Android RoboGuice 使用指南(13):RoboGuice 功能描述
  • Android RoboGuice 使用指南(14):Inject View
  • Android RoboGuice 使用指南(15):Inject Context
  • Android RoboGuice 使用指南(16):Standard Injection
  • Android RoboGuice 使用指南(17):Inject Extra
  • Android RoboGuice 使用指南(18):Inject Resources
  • Android RoboGuice 使用指南(19):发送接收Events

本例介绍如何Inject自定义的View,Inject自定义的View和Android自带的View(如TextView,Button)方法一样。

本例使用一个自定义的TextView,每隔1秒显示当前时间。前定义如下:

  1. //--------------------------------- PACKAGE ------------------------------------
  2. package com.pstreets.guice.customview;
  3.  
  4. //--------------------------------- IMPORTS ------------------------------------
  5. import android.content.Context;
  6. import android.os.Handler;
  7. import android.util.AttributeSet;
  8. import android.widget.TextView;
  9.  
  10. import java.util.Calendar;
  11. import java.util.Date;
  12.  
  13. public final class TimeTextView extends TextView {
  14.  
  15. public TimeTextView(Context context, AttributeSet attrs) {
  16. super(context, attrs);
  17. postDelayed(mUpdateView, mRepeatTimePeriod);
  18.  
  19. }
  20.  
  21. private void setTimeString() {
  22. Calendar c = Calendar.getInstance();
  23. Date currentTime = c.getTime();
  24. String timeString = formatTime(currentTime);
  25. setText(timeString);
  26. }
  27.  
  28. private Handler mHandler = new Handler();
  29. /**
  30. * one second.
  31. */
  32. private int mRepeatTimePeriod = 1000;
  33.  
  34. private Runnable mUpdateView = new Runnable() {
  35.  
  36. @Override
  37. public void run() {
  38. TimeTextView.this.setTimeString();
  39. // Force toggle again in a second
  40. mHandler.postDelayed(this, mRepeatTimePeriod);
  41. }
  42.  
  43. };
  44.  
  45. private String formatTime(Date time) {
  46. int hours = time.getHours();
  47. int miniutes = time.getMinutes();
  48. int seconds = time.getSeconds();
  49. String ret = "";
  50. if (hours < 10) {
  51. ret += "0";
  52. }
  53. ret += hours + ":";
  54. if (miniutes < 10) {
  55. ret += "0";
  56. }
  57. ret += miniutes + ":";
  58. if (seconds < 10) {
  59. ret += "0";
  60. }
  61. ret += seconds;
  62.  
  63. return ret;
  64. }
  65.  
  66. }

修改main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/hello"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. />
  13. <TextView
  14.  
  15. android:layout_width="fill_parent"
  16. android:layout_height="0dp"
  17. android:layout_weight="1.0"
  18.  
  19. />
  20. <com.pstreets.guice.customview.TimeTextView
  21. android:id="@+id/txtTime"
  22. android:layout_width="fill_parent"
  23. android:layout_height="wrap_content"
  24.  
  25. />
  26. </LinearLayout>
  27.  

定义该TimeTextView的id为txtTime。

这样可以在对应的Activity中使用InjectView 来给对应的txtTime 自动赋值(注入)。

  1. @ContentView(R.layout.main)
  2. public class GuiceDemo extends RoboActivity {
  3.  
  4. @InjectView (R.id.txtTime) TimeTextView txtTime;
  5.  
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. txtTime.setTextColor(0xFFFF0000);
  10.  
  11. }
  12.  
  13. }

由于GuiceDemo是从RoboActivity派生的,在onCreate 第一行的super.onCreate() 完成注入功能。如果你对RoboGuice1.1 熟悉的话,在使用注入的变量前如txtTime,需要执行setContentView。
在RoboGuice2.0中你可以使用同样的方法,2.0还提供了一个简单的标注方法@ContentView ,如本例,为Activity设置ContentView。

 。

从本例可以看出,和RoboGuice1.1 相比,RoboGuice2.0在使用上要简洁的多。本例只需从RoboActivity派生,不在需要定义Application等。