Android - 事件从Dialog传递到MainActivity

时间:2016-08-09 11:21:47

标签: android listview gridview motionevent

我有一个应用程序,我使用不同的播放器播放不同类型的流,例如我通过YouTube播放器API使用MediaPlayerYoutubePlayerSupportFragment。所以为此,我为Play / Pause / etc制作了一个单独的控制器,用户也可以单击一个浮动按钮(这会导致播放器收缩和拖动)。为此我使用了一个对话框(YouTube播放器API不允许在播放器顶部显示任何视图)。

所以我面临的问题是:当Dialog处于活动状态(显示)时,没有触摸事件传递给MainActivity。我通过来自MotionEvent dispatchTouchEvent()的{​​{1}}的{​​{1}} Activity来发送Dialog,从而克服了这个问题。它可以正常运行,我现在可以在应用的不同部分之间切换,但我无法在dispatchTouchEvent()ListView上获得任何点击事件其他工作正常。

我查看了GridView' ListView,我得到了所有dispatchTouchEvent()

这是我用来向MotionEvent发送事件的代码。

MainActivity

我可以滚动@Override public boolean dispatchTouchEvent(MotionEvent event) { if (isPlayerMinimized) { if (playerDraggableView != null) { playerDraggableView.dispatchTouchEvent(event); } return ((MainActivity) mContext).dispatchTouchEvent(event); } else if (!onControlViews(event)) { detector.onTouchEvent(event); } return super.dispatchTouchEvent(event); } ListView,但无法触发GridViewOnItemClickListener个事件。

我的问题是,这是正确/预期的行为吗?如果是,有任何方法可以将OnItemLongClickListener发送到MotionEvent。或者我错过了什么?如果是这种情况,那么请指出。

我知道这里没有足够的代码来正确提供解决方案,但如果我遗漏了一些明显的东西,那么请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

不支持将MotionEvent从对话框发送回MainActivity并不奇怪,这绝对不是Dialog的预期用途。

一次可以在一个活动中激活多个Fragment所以没有理由不能将完全独立的片段放在YouTubePlayerSupportFragment上作为传输控件或无论你需要什么。诀窍是将每个Fragment放置在容器ViewGroup中,例如FrameLayout,并以这种方式管理它们。

您无法添加其他重叠的片段,请参阅下面的修改。

E.g。

SomeFragment fragment = SomeFragment.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(containerId, fragment, "useful_tag_for_fragment");
fragmentTransaction.commitAllowingStateLoss();

显然,请确保您的传输(播放,暂停,停止控件)Fragment高于绘制顺序中的YouTubePlayerSupportFragment,否则它将被遮挡。

对于FragmentActivity对象之间通信的单独问题,您可以使用Otto这是我个人最喜欢的事件总线。

修改

虽然通常可以覆盖Fragment s,但YouTubePlayer明确禁止此操作并引发YouTubePlayer.ErrorReason.UNAUTHORIZED_OVERLAY错误。

但是,直接在布局XML中使用时,似乎可以在YouTubePlayerView上添加叠加层。这里的问题是您必须使用扩展YouTubeBaseActivity的活动,该活动不支持您正在寻找的灵活性,尤其是缩小和拖动和交换{{1包裹MediaPlayer等等。

从我所看到的,没有办法解决这个问题,还有很多其他人在询问这个问题,而且没有任何事情发生。在一天结束时,此代码是封闭源代码,YouTube显然希望保护其品牌。