• Butter Knife的一些使用特性

    非Activity中的注入
    服务器君一共花费 26.129 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    前面提到了Butter Knife的三个特性,这里简单介绍一下:

    非Activity中的注入

    你也可以在任意的对象中提供你自己的自己的根视图,比如Fragment里:

    public class FancyFragment extends Fragment {
        @InjectView(R.id.button1) Button button1;
        @InjectView(R.id.button2) Button button2;
    
        @Override
        View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fancy_fragment, container, false);
            ButterKnife.inject(this, view);
            // TODO Use "injected" views...
            return view;
        }
    }
    

    在 ViewHolder 模式中注入

    public class MyAdapter extends BaseAdapter {
        @Override
        public View getView(int position, View view, ViewGroup parent) {
            ViewHolder holder;
          if (view != null) {
                  holder = (ViewHolder) view.getTag();
          } else {
                  view = inflater.inflate(R.layout.whatever, parent, false);
                  holder = new ViewHolder(view);
                  view.setTag(holder);
            }
    
          holder.name.setText("John Doe");
          // etc...
    
          return view;
        }
    
        static class ViewHolder {
            @InjectView(R.id.title) TextView name;
            @InjectView(R.id.job_title) TextView jobTitle;
    
            public ViewHolder(View view) {
                ButterKnife.inject(this, view);
            }
        }
    }
    

    View 事件回调函数注入

    下面是几种注入回调函数的方法示例:

    // 带有 Button 参数
    @OnClick(R.id.submit)
    public void sayHi(Button button) {
      button.setText("Hello!");
    }
     
    // 不带参数
    @OnClick(R.id.submit)
    public void submit() {
      // TODO submit data to server...
    }
     
    // 同时注入多个 View 事件
    @OnClick({ R.id.door1, R.id.door2, R.id.door3 })
    public void pickDoor(DoorView door) {
      if (door.hasPrizeBehind()) {
        Toast.makeText(this, "You win!", LENGTH_SHORT).show();
      } else {
        Toast.makeText(this, "Try again", LENGTH_SHORT).show();
      }
    }
    

    如果需要在 界面 销毁的时候,把注入的 View 设置为 Null, 则可以用 reset 函数:

    public class FancyFragment extends Fragment {
      @InjectView(R.id.button1) Button button1;
      @InjectView(R.id.button2) Button button2;
     
      @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fancy_fragment, container, false);
        ButterKnife.inject(this, view);
        // TODO Use "injected" views...
        return view;
      }
     
      @Override void onDestroyView() {
        super.onDestroyView();
        Views.reset(this);
      }
    }
    

    另外 还支持 可选的 View 注入,如果该 View 没有,就没有吧:

    @Optional @InjectView(R.id.might_not_be_there) TextView mightNotBeThere;
     
    @Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
      // TODO ...
    }
    

    最后 还有两个 findViewById 函数来简化查找 View 的方式,如果上面都满足不了你的需求,你可以用用他们:

    View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
    TextView firstName = Views.findById(view, R.id.first_name);
    TextView lastName = Views.findById(view, R.id.last_name);
    ImageView photo = Views.findById(view, R.id.photo);
    
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android根基概念Context 8 个条目
  2. [Python程序设计] Django模板系统 11 个条目
  3. [移动开发] 从代码角度去认识HttpClient 2 个条目
  4. [Python程序设计] Python HTTP服务器 7 个条目
  5. [移动开发] Android 网络通信框架Volley 1 个条目
  6. [软件工程与项目管理] 呈现器的布局与绘制 11 个条目
  7. [移动开发] Layout_weight属性解析 5 个条目
  8. [JavaScript程序设计] Web实时通信技术名词解析 5 个条目
  9. [运维管理] 路由器与交换机 4 个条目
  10. [Python程序设计] Tornado源码解析 23 个条目
  11. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  12. [软件工程与项目管理] 浏览器的CSS解析 7 个条目
窗口 -- [协会]