我有一个应用程序,我使用不同的播放器播放不同类型的流,例如我通过YouTube播放器API使用MediaPlayer
和YoutubePlayerSupportFragment
。所以为此,我为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
,但无法触发GridView
或OnItemClickListener
个事件。
我的问题是,这是正确/预期的行为吗?如果是,有任何方法可以将OnItemLongClickListener
发送到MotionEvent
。或者我错过了什么?如果是这种情况,那么请指出。
我知道这里没有足够的代码来正确提供解决方案,但如果我遗漏了一些明显的东西,那么请告诉我。谢谢!
答案 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
,否则它将被遮挡。
对于Fragment
和Activity
对象之间通信的单独问题,您可以使用Otto这是我个人最喜欢的事件总线。
修改强>
虽然通常可以覆盖Fragment
s,但YouTubePlayer
明确禁止此操作并引发YouTubePlayer.ErrorReason.UNAUTHORIZED_OVERLAY
错误。
但是,直接在布局XML中使用时,似乎可以在YouTubePlayerView
上添加叠加层。这里的问题是您必须使用扩展YouTubeBaseActivity
的活动,该活动不支持您正在寻找的灵活性,尤其是缩小和拖动和交换{{1包裹MediaPlayer
等等。
从我所看到的,没有办法解决这个问题,还有很多其他人在询问这个问题,而且没有任何事情发生。在一天结束时,此代码是封闭源代码,YouTube显然希望保护其品牌。