欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 自定义view模板并实现点击事件的回调

程序员文章站 2023-12-20 19:12:10
android 自定义view模板并实现点击事件的回调 主要的目的就是仿老版qq的一个界面做一个模板。然后实现点击事件的回调。先看效果图: 步骤如下: 1....

android 自定义view模板并实现点击事件的回调

主要的目的就是仿老版qq的一个界面做一个模板。然后实现点击事件的回调。先看效果图:

Android 自定义view模板并实现点击事件的回调

步骤如下:

1.在res/values/目录下新建一个atts.xml文件

内容如下:

<resources>
  <declare-styleable name="topbar">
    <attr name="title" format="string"/>
    <attr name="titlebacgroud" format="reference|color"/>
    <attr name="titlesize" format="dimension"></attr>

    <attr name="leftbtntitle" format="string"></attr>
    <attr name="leftbtncolor" format="color"></attr>
    <attr name="leftbtnsize" format="dimension"></attr>

    <attr name="rightbtntitle" format="string"></attr>
    <attr name="rightbtncolor" format="color"></attr>
    <attr name="rightbtnsize" format="dimension"></attr>

  </declare-styleable>

attr.xml文件完成后,就是写一个topbar.java文件来进行布局:

public class topbar extends relativelayout{

  private button leftbtn, rightbtn;
  private textview tvtitle;

  private string title;
  private float titlesize ;
  private drawable titlebackground;

  private string leftbtntitle;
  private int leftbtncolor;
  private float leftbtnsize;

  private string rightbtntitle;
  private int rightbtncolor;
  private float rightbtnsize;

  private layoutparams leftbtnparams ,righbtnparams,titleparams;

  /**
   * 为topbar添加回调点击事件,好处是不需要每次都修改topbar中的点击事件,只需修改从外面传进来的listener的点击事件
   * @param context
   * @param attrs
   */

  public interface topbarclicklistener{
    void leftbtnclick();
    void rightbtnclick();
  }

  private topbarclicklistener listener;

  public void settopbarclicklistener(topbarclicklistener ls){
    this.listener = ls;
  }

  public topbar(context context, attributeset attrs) {
    super(context, attrs);
    // todo auto-generated constructor stub


    typedarray ta = context.obtainstyledattributes(attrs, r.styleable.topbar);

    title = ta.getstring(r.styleable.topbar_title);
    titlesize = ta.getdimension(r.styleable.topbar_titlesize, 0);
    titlebackground = ta.getdrawable(r.styleable.topbar_titlebacgroud);

    leftbtntitle = ta.getstring(r.styleable.topbar_leftbtntitle);
    leftbtncolor = ta.getcolor(r.styleable.topbar_leftbtncolor, 0);
    leftbtnsize = ta.getdimension(r.styleable.topbar_leftbtnsize, 0);

    rightbtntitle = ta.getstring(r.styleable.topbar_rightbtntitle);
    rightbtncolor = ta.getcolor(r.styleable.topbar_rightbtncolor, 0);
    rightbtnsize = ta.getdimension(r.styleable.topbar_rightbtnsize, 0);

    ta.recycle();//资源回收

    tvtitle = new textview(context);
    leftbtn = new button(context);
    rightbtn = new button(context);

    tvtitle.settext(title);
    tvtitle.settextsize(titlesize);
    tvtitle.setbackground(titlebackground);

    leftbtn.settext(leftbtntitle);
    leftbtn.settextcolor(leftbtncolor);
    leftbtn.settextsize(leftbtnsize);

    rightbtn.settext(rightbtntitle);
    rightbtn.settextcolor(rightbtncolor);
    rightbtn.settextsize(rightbtnsize);

    setbackgroundcolor(color.dkgray);//设置整个背景色

    /**
     * 将3个控件进行布局
     */
    //左边的按钮位于父布局的左边,通过addrule(relativelayout.align_parent_left);来实现
    leftbtnparams = new layoutparams(relativelayout.layoutparams.wrap_content,
        relativelayout.layoutparams.wrap_content);
    leftbtnparams.addrule(relativelayout.align_parent_left);
    leftbtnparams.setmargins(0, 18, 0, 0);
    addview(leftbtn, leftbtnparams);

    righbtnparams = new layoutparams(relativelayout.layoutparams.wrap_content,
        relativelayout.layoutparams.wrap_content);
    righbtnparams.addrule(relativelayout.align_parent_right);
    righbtnparams.setmargins(0, 18, 0, 0);
    addview(rightbtn, righbtnparams);
    //中间的textview位于父布局的中间,addrule(relativelayout.center_in_parent);
    titleparams = new layoutparams(relativelayout.layoutparams.wrap_content,
        relativelayout.layoutparams.match_parent);
    titleparams.addrule(relativelayout.center_in_parent);

    tvtitle.setgravity(gravity.center);

    addview(tvtitle, titleparams);


    leftbtn.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo auto-generated method stub
        listener.leftbtnclick();
      }
    });


    rightbtn.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo auto-generated method stub
        listener.rightbtnclick();
      }
    });

  }

  public void settvtitle(string value){
    tvtitle.settext(value);
  }

}

topbar是通过继承自relativelayout来实现的。

注意:由于我们的目的是自定义模板view,所以我们最好不要在topbar.java中做如下操作:

leftbtn.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo auto-generated method stub
        //listener.leftbtnclick();//回调实现
        toast.maketext(context, "left buttom click", toast.length_short).show();
      }
    });


    rightbtn.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo auto-generated method stub
        //listener.rightbtnclick();//回调实现
        toast.maketext(context, "right buttom click", toast.length_short).show();
      }
    });

如果这样做对于不同的点击事件都需要修改topbar.java文件中的点击事件,失去了模板的意义。

主布局文件代码如下:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:custom="http://schemas.android.com/apk/res/com.example.viewpagerdemo"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <com.example.viewpagerdemo.view.topbar 
    android:id="@+id/topbar"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    custom:title="网易新闻"
    custom:titlebacgroud="#ff2255"
    custom:titlesize="30sp"
    custom:leftbtntitle="back"
    custom:leftbtncolor="#ff4400"
    custom:leftbtnsize="24sp"
    custom:rightbtntitle="more"
    custom:rightbtncolor="#ff4400"
    custom:rightbtnsize="24sp"
    ></com.example.viewpagerdemo.view.topbar>

</linearlayout>

上面的xmlns:custom=”http://schemas.android.com/apk/res/com.example.viewpagerdemo”是必须要添加的,res/ 后面是包名。作用相当于导入包名

mainactivity.java 文件如下:

public class topbaractivity extends activity{

  private topbar mtopbar;

  @override
  protected void oncreate(bundle savedinstancestate) {
    // todo auto-generated method stub
    super.oncreate(savedinstancestate);
    requestwindowfeature(window.feature_no_title);

    setcontentview(r.layout.topbar_layout);

    mtopbar = (topbar) findviewbyid(r.id.topbar);

    /**
     * 利用回调实现topbar的点击事件
     */
    mtopbar.settopbarclicklistener(new topbarclicklistener() {

      @override
      public void rightbtnclick() {
        // todo auto-generated method stub
        toast.maketext(topbaractivity.this, "right buttom click", toast.length_short).show();
      }

      @override
      public void leftbtnclick() {
        // todo auto-generated method stub
        toast.maketext(topbaractivity.this, "left buttom click", toast.length_short).show();
      }
    });

    //更改topbar中显示的标题
    mtopbar.settvtitle("凤凰网");

  }
}

这样可以在mainactivity中通过回调来实现点击事件。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: