实现android视图自动绑定

164 阅读1分钟

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…