android SDK开发 — TitleBar封装 (一) 点击打开链接

    这一篇讲述一下TitleBar怎么增加交互

    BaseActivity 中的逻辑实现

    1. private ViewSwitcher[] titleSwitcher;
    2. /**
    3. * 初始化View
    4. */
    5. protected void findViewById() {
    6. titleSwitcher = new ViewSwitcher[3];
    7. titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);
    8. titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);
    9. titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);
    10. }
    11. protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
    12. TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };
    13. for (int i = 0; i < reses.length; i++) {
    14. TitleRes res = reses[i];
    15. ViewSwitcher switcher = titleSwitcher[i];
    16. if (res == null) {
    17. switcher.setVisibility(View.INVISIBLE);
    18. } else {
    19. switcher.setVisibility(View.VISIBLE);
    20. // 触发单击事件的View
    21. View clickView = null;
    22. // 文字
    23. if (res.getType() == 0) {
    24. switcher.setDisplayedChild(0);// 显示TextView
    25. //
    26. Object resource = res.getResource();
    27. String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);
    28. ((TextView) switcher.getChildAt(0)).setText(title);
    29. clickView = switcher.getChildAt(0);
    30. } else {
    31. switcher.setDisplayedChild(1);// 显示ImageView
    32. //
    33. int imageResource = (Integer) res.getResource();
    34. ((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);
    35. clickView = switcher.getChildAt(1);
    36. }
    37. // 设置title的单击事件
    38. clickView.setOnClickListener(res.getClickListener());
    39. }
    40. }
    41. }
    42.  

    自雷TitleSampleActivity 调用如下

    1. @Override
    2. protected void findViewById() {
    3. setContentView(R.layout.title_demo);
    4. super.findViewById();
    5. // setTitle("返回主页", "这是一个Title", "下一个界面");
    6. TitleRes left = new TitleRes("left", new View.OnClickListener() {
    7. @Override
    8. public void onClick(View v) {
    9. Toast.makeText(TitleDemoActivity.this, "click left", Toast.LENGTH_SHORT).show();
    10. //showToast("click left");
    11. }
    12. });
    13. TitleRes middle = new TitleRes("middle", new View.OnClickListener() {
    14. @Override
    15. public void onClick(View v) {
    16. Toast.makeText(TitleDemoActivity.this, "click middle", Toast.LENGTH_SHORT).show();
    17. //showToast("click middle");
    18. }
    19. });
    20. TitleRes right = new TitleRes("right", new View.OnClickListener() {
    21. @Override
    22. public void onClick(View v) {
    23. Toast.makeText(TitleDemoActivity.this, "click right", Toast.LENGTH_SHORT).show();
    24. //showToast("click right");
    25. }
    26. });
    27. //
    28. setTitle(left, middle, right);
    29. }

    这个时候title三个控件都具备了交互的能力

    Toast.makeText(TitleDemoActivity.this,"click right",Toast. LENGTH_SHORT ).show();

    程序中会频繁的用到 context Toast等对象

    采用Class.this的方式在代码移植、维护、重构等方面很不友好

    另外频繁调用Toast每次都那么写的话 麻烦死

    所以BaseActivity中新增俩方法

    作用于暂且定义为protected 以后估计还得改

    1. protected Context getContext() {
    2. returnthis;
    3. }
    1. protectedvoid showToast(String message) {
    2. Toast.*makeText*(getContext(), message,Toast.*LENGTH_SHORT*).show();
    3. }

    这个时候子类调用父类的代码如下

    1. TitleRes left =newTitleRes("left",newView.OnClickListener() {
    2. @Override
    3. publicvoid onClick(View v) {
    4. showToast("click left");//
    5. }
    6. });
    7. 。。。。中、右略
    8. //
    9. setTitle(left,middle, right);