使用android注释在@EBean里面的@ViewById

时间:2014-05-03 21:12:36

标签: android android-annotations

无法让@ViewById在@EBean中工作。

@EActivity(R.layout.data_layout)
public class MyActivity extends Activity {
   @Bean
   MyEbean bean;

   @AfterViews
   public void setupView() {
     bean.loadData("Test name");
   }
}

@EBean
public class MyEbean {
   @RootContext
   context;

   @ViewById(R.id.name_field)
   TextView nameField;

  public void loadData(String name) {
    nameField.setText(name); 
  }
}

"名称字段" in loadData()为null。同时如果我在loadData()

中执行此操作
 nameField = (TextView)((Activity) context).findViewById(R.id.name_field);

一切都很好。所以这个观点肯定存在。此外,如果我通过改装回调(即延迟之后)调用此方法" name"是自动填充的。我在那里做错了什么?

我正在使用Android Annotations 3.0.1。

2 个答案:

答案 0 :(得分:2)

@Leo这里是自定义视图和绑定数据的实现。我想制作像芯片一样的小部件

http://www.google.com/design/spec/components/chips-tokens.html

首先在xml中定义布局

<?xml version="1.0" encoding="utf-8"?>

<ImageView
    android:id="@+id/ivIcon"
    android:layout_width="@dimen/chip_size"
    android:layout_height="@dimen/chip_size"
    android:src="@drawable/default_icon" />

<TextView
    android:id="@+id/tvName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="8dp"
    android:layout_toRightOf="@+id/ivIcon"
    android:fontFamily="sans-serif"
    android:lines="1"
    android:singleLine="true"
    android:textColor="@color/secondary_text"
    android:textSize="14sp" />

创建一个类并使用@eviewgroup注释它 ChipView.java

@EViewGroup(R.layout.layout_chip)
public class ChipView extends RelativeLayout{

@App
App app;

public ChipView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

}

public ChipView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public ChipView(Context context) {
    super(context);
}

@ViewById(R.id.layoutChipContainer)
View container;

@ViewById(R.id.ivIcon)
ImageView ivIcon;

@ViewById(R.id.tvName)
TextView tvName;

public void bind(User user){

    tvName.setText(user.getUsername());

    app.imageLoader.displayImage(user.getPicture(), ivIcon, app.myResources.iconOptions);
}

}

然后在您的活动中

ChipView v = ChipView_.build(context);

v.bind(user);

其中context是某种上下文,user是POJO

非常容易。

答案 1 :(得分:1)

@EBean带注释的类不应该执行任何与视图相关的工作,因为它们可以在每个增强的类中注入(即使用@EService注释,@EBean,{{1} },...)。

如果您能够在通过@EActivity检索的上下文中执行findViewById,那只是因为 - 在这种情况下 - 给予bean的上下文是活动。但是根据bean的注入位置,它也可以是ApplicationContext或链接到另一个acivity / layout的Context。