本文共 10764 字,大约阅读时间需要 35 分钟。
MainActivity
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(this,"Test", "User",true); binding.setUser(user); }}
User
public class User { public final String firstName; public final String lastName; public Context context; public boolean isFriend; public User(Context context,String firstName, String lastName,boolean isFriend) { this.context=context; this.firstName = firstName; this.lastName = lastName; this.isFriend=isFriend; }}
XML
MainActivity
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(this,"Test", "User",true); binding.setUser(user); binding.setHandlers(new MyHandlers()); }}
User类没变
XMLMainActivity
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); Listlist=new ArrayList<>(); list.add("aaa"); binding.setUserList(list); }}
XML
其中特别注意一点,在@{}表达式中不支持左括号,所以我们需要用转义字符代替左括号
public class Teacher { public static String GG(){ return "1111111"; }}
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList("尼玛"); }}
和 Java 一样,java.lang.* 会被自动导入。
public class User { public final String firstName; public final String lastName; public Listlist=new ArrayList (); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(String st){ System.out.println("st = " + st); return "asdas"; }}
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
public class User { public final String firstName; public final String lastName; public Listlist=new ArrayList (); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(Context context){ Toast.makeText(context,"toast",Toast.LENGTH_LONG).show(); return "asdas"; }}
binding 类会生成一个命名为context的特殊变量(其实就是 rootView 的 getContext())的返回值),这个变量可用于表达式中. 如果有名为context的变量存在,那么生成的这个context特殊变量将被覆盖.
这里TextView直接引用第一次TextView,yaoyanName为id的驼峰命名
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
public class User { public final String firstName; public final String lastName; public Listlist=new ArrayList (); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(String st){ System.out.println("st = " + st); return "asdas"; } public String ggg(Context context){ Toast.makeText(context,"toast",Toast.LENGTH_LONG).show(); return "asdas"; }}
MainActivity
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private ListmDatas; private HomeAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter = new HomeAdapter()); } protected void initData() { mDatas = new ArrayList (); for (int i = 1; i < 100; i++) { mDatas.add("----" + i); } } class HomeAdapter extends RecyclerView.Adapter { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getApplicationContext()), R.layout.item_home, parent, false); MyViewHolder holder=new MyViewHolder(binding); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { ItemHomeBinding binding = (ItemHomeBinding) holder.getBinding(); String s = mDatas.get(position); Item item=new Item(); item.setS(s); binding.setVariable(BR.obj, item); binding.executePendingBindings(); } @Override public int getItemCount() { return mDatas.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private ViewDataBinding binding; public MyViewHolder(ViewDataBinding binding) { super(binding.getRoot()); this.binding=binding; } public ViewDataBinding getBinding() { return binding; } } }}
executePendingBindings()方法.这个方法迫使数据立即绑定而不是在下一帧的时候才绑定.RecyclerView会在onBindViewHolder方法执行后立即测量这些view.假设没使用executePendingBindings()方法,由于在下一帧的时候才会绑定,view就会绑定错误的data,测量也会出错.因此,executePendingBindings()是很重要的.
Item
public class Item { private String s; public String getS() { return s; } public void setS(String s) { this.s = s; }}
Item_XML
Main_XML
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private ListmDatas; private HomeAdapter mAdapter; private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); }}
public class myView extends LinearLayout { public myView(Context context) { super(context); } public myView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public myView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public myView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } // 自动 Setter public void setObject(String u) { System.out.println("myView.setObject"); }}
app:object='@{"123"}' android:layout_width="match_parent" android:layout_height="match_parent" />
当表达式引用了一个类内的属性时,他会尝试直接调用域,getter,还有ObservableFields。
Observable 接口有一个添加/移除 listener 的机制,但通知取决于开发者。为了简化开发,我们创建了一个基类 BaseObservable,来实现 listener 注册机制。这个类也实现了域变动的通知,你只需要在 getter 上使用 Bindable 注解,并在 setter 中实现通知。
Userpublic class User extends BaseObservable{ public String firstName; public String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); }}
MainActivity
public class MainActivity extends AppCompatActivity { private ListmDatas; private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); User u=new User("123","456w"); activityMainBinding.setUser(u); }}
XML
一些属性的命名与 setter 不对应,针对这些函数,可以用 BindingMethods注解来将属性与setter绑定在一起.举个例子:android:tint属性可以这样与setImageTintList(ColorStateList) ) 绑定,而不是 setTint :