Android Snackbar中事件监听器回调时的实参

一、问题引出

我们都知道Snackbar的基本使用方法是获得Snackbar的实例后调用setAcion()设置一个可交互的按钮,当单击时会回调第二个参数设置的监听器方法,但回调这个方法时,传给方法参数的实参到底是什么呢,它好像并不像普通的按钮那样简单。

Android Snackbar中事件监听器回调时的实参

二、试验

在onClick()方法中使用view.getId()方法获得它的id,并打印出来。

打印布局件中的每一个组件(包括根布局组件)的id。

比较一下,结果是这个view的id不与布局文件中任何一个id相同,也就是说传给它的实参并不是布局文件中的组件。

那猜想一下,我们单击时,单击的是一个按钮,并且会显示的“确定删除数据”这条消息,那会不会是这两个组件其中的一个。

三、结果

  • 查看一下setAction()方法的源码Android Snackbar中事件监听器回调时的实参
  • 虽然看不太懂,但可以发现这里有一个TextView的组件,那有可能传进去的就是这个。
  • 这个TextView的对象,是先用类中的view实例调用getChildAt()方法获得一个SnackbarContentLayout的实例,再用这个实例调用getActionView()获得的。
  • 我们编写一个方法使用同样的手段获得一个Snackbar实例中创建的这个TextView的实例的id。Android Snackbar中事件监听器回调时的实参
  • 接下来用这个方法获得那个TextView的id并打印出来比较。Android Snackbar中事件监听器回调时的实参
  • 可以看到这两个id是相同的,所以回调监听器方法时传入的实参就是这个TextView。Android Snackbar中事件监听器回调时的实参