Android开发:如何在自定义GridView中访问外部按钮的setOnClickListener
实现方案
Android组件开发遵循职责分离原则,不需要在自定义GridView内部持有Activity的控件引用,反过来通过Activity调用自定义View对外暴露的公共方法即可实现需求,具体步骤如下:
1. 改造自定义GridView,对外暴露公共方法
先把你需要给外部调用的逻辑都定义为public方法:
public class GridView extends View { // 重置网格方法改为public public void resetGrid(){ // 原有重置网格的相关逻辑 } // 新增:开始寻路方法,接收外部传入的配置参数 public void startPathFind(boolean allowDiagonal, float speed){ // 原有寻路逻辑,直接使用传入的参数即可 } // 新增:更新是否允许对角线走法 public void setAllowDiagonal(boolean isAllow){ // 内部保存该参数,需要刷新界面的话调用invalidate() } // 新增:更新动画速度 public void setAnimSpeed(float speed){ // 内部保存速度参数 } }
2. 在MainActivity中获取自定义GridView实例
在onCreate方法中初始化自定义View的引用:
public class MainActivity extends AppCompatActivity { // 声明自定义GridView成员变量 private GridView mCustomGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 替换为你布局里GridView对应的id mCustomGridView = findViewById(R.id.grid_view); // 其他控件的初始化逻辑 Button resetBtn = findViewById(R.id.reset_btn); Button startBtn = findViewById(R.id.start_btn); CheckBox diagonalCb = findViewById(R.id.diagonal_cb); SeekBar speedSb = findViewById(R.id.speed_sb); } }
3. 在控件回调中调用自定义View的方法
所有控件的监听都写在Activity里,需要操作GridView时直接调用对应方法即可:
重置按钮点击逻辑
resetBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(PathFind.this, "reset", Toast.LENGTH_SHORT).show(); // 直接调用重置方法 mCustomGridView.resetGrid(); } });
其他控件逻辑示例
- 开始按钮点击:调用
mCustomGridView.startPathFind(diagonalCb.isChecked(), speedSb.getProgress()) - 对角线勾选框状态变化:在
OnCheckedChangeListener中调用mCustomGridView.setAllowDiagonal(isChecked) - 速度滑块数值变化:在
OnSeekBarChangeListener的onProgressChanged回调中调用mCustomGridView.setAnimSpeed(progress)
补充说明
该方式是Android开发的标准实现,自定义View只负责自身内部逻辑,不依赖上层Activity的具体控件实现,后续如果需要把这个GridView复用到其他页面,不需要修改任何内部代码。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

