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
下一篇: 三色阶梯