1.前言
相信许多android开发者对以下的代码片段都不会陌生,即需要将layout中的控件/视图与成员变量绑定,使得可以通过代码操纵控件。
以下代码不难看出,xxx = findViewById(R.id.xxx);显然是冗余代码,本篇旨在解决此问题。
public class MainActivity extends AppCompatActivity {
private TextView textView = null;
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
buttton = findViewById(R.id.button);
}
}
2.注解@Bind
鉴于以上的冗余问题,我的思路是使用注解来解决或改善该问题,即,我希望将以上的代码块变成如下,且 @Bind 可传参。
- 无参:@Bind,在视图中寻找id与成员变量名相同的控件并绑定。
- 带参:@Bind("xxx"),在视图中寻找id为xxx的控件并绑定。
public class MainActivity extends AppCompatActivity {
@Bind
private TextView textView = null;
@Bind("R.id.customButton")
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
3.实现
在实现的过程,发现对视图的实例化监听是个非常困难的问题,退而求其次,最终的代码如下,使用ViewBinder.bind(this,R.id.class);实现对 @Bind 注解的解析,从而达到自动绑定的效果。
Activity
public class MainActivity extends AppCompatActivity {
@Bind
TextView textView;
@Bind
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 自动绑定View */
ViewBinder.bind(this,R.id.class);
}
}
Fragment
public class TestFragment extends Fragment {
@Bind
TextView textView;
public TestFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_test, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
/* 自动绑定View */
ViewBinder.bind(this,R.id.class);
textView.setText("This is TestFragment TextView.");
}
}
以上为Activity和Fragment中的视图自动绑定示例,更多细节,可试读开源工程: github.com/ayowin/View…