广告
返回顶部
首页 > 资讯 > 移动开发 >Android 自定义view模板并实现点击事件的回调
  • 692
分享到

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

view回调事件自定义viewAndroid 2022-06-06 04:06:27 692人浏览 安东尼
摘要

Android 自定义view模板并实现点击事件的回调 主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图: 步骤如下: 1.在res/va

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

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

BACK 和MORE是两个按钮,

步骤如下:

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;
  
  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);//设置整个背景色
    
    //左边的按钮位于父布局的左边,通过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);
    
    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中通过回调来实现点击事件。

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

您可能感兴趣的文章:Android中父View和子view的点击事件处理问题探讨实例详解Android解决按钮重复点击问题Android之有效防止按钮多次重复点击的方法(必看篇)Android 快速实现防止网络重复请求&按钮重复点击的方法Android 防止多次重复点击的三种方法的示例Android防止按钮重复点击示例代码Android优雅地处理按钮重复点击的几种方法Android中如何优雅的处理重复点击实例代码Android中aop的应用实践之过滤重复点击Android开发教程之如何屏蔽View的重复点击


--结束END--

本文标题: Android 自定义view模板并实现点击事件的回调

本文链接: https://www.lsjlt.com/news/22464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作