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

android 自定义View组合 子View绑定父View点击事件

程序员文章站 2022-07-13 15:30:36
...

android 自定义View组合 子View绑定父View点击事件

参考了很多文章都是用接口,不够直接,后来想到了callonclick

package com.example.estorm.areamap;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 自定义 View组合 方便复用
 */
public class mViewLayout extends LinearLayout {
    private Button mButton;
    private TextView mTextView;

    public mViewLayout(Context context) {
        super(context);
    }
    public mViewLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(VERTICAL);   //垂直布局
        LayoutInflater.from(context).inflate(R.layout.m_view_layout, this, true);
        mButton = findViewById(R.id.mBtn);
        mTextView = findViewById(R.id.mTxt);

        TypedArray mAttribute = context.obtainStyledAttributes(attrs,R.styleable.mViewLayout);
        //如果第一个参数没有找到对应的资源,则返回defValue设置的值。
        mButton.setBackgroundResource(mAttribute.getResourceId(R.styleable.mViewLayout_mBackground,0));
        mTextView.setText(mAttribute.getString(R.styleable.mViewLayout_mLText));

        mAttribute.recycle(); //回收

        //匿名内部类this指向该内部类,本类需另起名
        final mViewLayout me = this;
        //子View绑定父View点击事件,功能同下面接口
        mButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                me.callOnClick();
            }
        });
    }

    /**
     * 定义一个接口 让调用者自己实现具体逻辑
     */
    public interface MyViewClickListener {
        void myClick(View v);
    }
    /**
     * 开放一个方法给外部来设置点击事件,参数用接口的形式得到调用者自己设置的逻辑
     * @param myViewClickListener 监听器接口类
     */
    public void setMyViewListener(final MyViewClickListener myViewClickListener) {
        mButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                myViewClickListener.myClick(v);
            }
        });
    }


}

主activity的onCreate方法加入

final mViewLayout mVL = findViewById(R.id.refreshId);
        //会覆盖布局文件绑定的onClick方法
        mVL.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击事件
            }
        });
        //调用自定义View方法,传入接口参数,使子View执行父View方法
        mVL.setMyViewListener(new mViewLayout.MyViewClickListener() {
            @Override
            public void myClick(View v) {
                   mVL.callOnClick();
            }
        });
相关标签: 自定义view