java - Recyclerview 中的对话框 - IllegalStateException:指定的子级已经有父级
问题描述
我有一个对话框,我设置为在 recyclerview 中单击按钮时全屏播放视频。所以每当我点击视频播放器上的全屏按钮时,它都会崩溃IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我不想从 recyclerview 中删除视图,因为当我添加回相同的视图时,它与 recyclerview 上的项目重叠。所以我创建了新的视频播放器实例并将其提供给对话框的addContentView
方法,但它给出了同样的错误。
public class ExoPlayer_Main {
public static final String TAG="###ExoPlayer###";
MediaSource mediaSource;
Context context;
PlayerView playerView;
SimpleExoPlayer player;
boolean playWhenReady=false;
long playbackPosition;
int currentWindow;
int newPlayerState=1;
List<Uri> mediaList=new ArrayList<>();
ComponentListener componentListener=new ComponentListener();
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();
private FrameLayout mFullScreenButton;
//Fullscreen Setting
ImageView mFullScreenIcon;
private boolean mExoPlayerFullscreen = false;
private Dialog mFullScreenDialog;
public ExoPlayer_Main(Context context, PlayerView playerView) {
this.context = context;
this.playerView=playerView;
}
public void initializePlayer(Uri uri,int mediaType){
Log.d(TAG,"Init Player Calling ");
if (player==null){
player = ExoPlayerFactory.newSimpleInstance(context);
player.clearVideoSurface();
player.addListener(componentListener);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow,playbackPosition);
player.clearVideoSurface();
mediaSource = buildMediaSourceNew(uri,mediaType);
playerView.setPlayer(player);
player.prepare(mediaSource);
initFullscreenButton();
}
}
private void initFullscreenButton() {
PlayerControlView controlView = playerView.findViewById(R.id.exo_controller);
mFullScreenIcon = controlView.findViewById(R.id.exo_fullscreen_icon);
mFullScreenButton = controlView.findViewById(R.id.exo_fullscreen_button);
mFullScreenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mExoPlayerFullscreen){
openFullscreenDialog();
}else{
closeFullscreenDialog();
}
}
});
}
private void openFullscreenDialog() {
initFullscreenDialog();
((ViewGroup)playerView.getParent()).removeView(playerView);
player.setPlayWhenReady(false);
mFullScreenDialog.addContentView(playerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mFullScreenIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_fullscreen_skrink));
mExoPlayerFullscreen = true;
mFullScreenDialog.show();
}
private void closeFullscreenDialog() {
((ViewGroup) playerView.getParent()).removeView(playerView);
FrameLayout playerAdd = ((Activity)context).findViewById(R.id.main_media_frame);
playerAdd.addView(playerView);
mExoPlayerFullscreen = false;
mFullScreenDialog.dismiss();
mFullScreenIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_fullscreen_expand));
}
private void initFullscreenDialog() {
mFullScreenDialog = new Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
public void onBackPressed() {
if (mExoPlayerFullscreen)
closeFullscreenDialog();
super.onBackPressed();
}
};
}
我需要用我的视频播放器打开全屏对话框,当我关闭视频时它不会弄乱我的recyclerview
解决方案
我没有在您的代码中发现问题,但是创建全屏活动不是更好吗?你可以创建一个片段类来处理 exoplayer,然后你只需要在你的全屏布局和你的 recyclerview 上膨胀它。
当用户点击recyclerview时,您只需要设置视频的实际位置,不要忘记在Manifest文件的全屏活动标签中设置全屏样式。
推荐阅读
- python - 如何防止 Google Colab 断开连接?
- python - 有没有办法以不同的方式编辑列表中相同子字符串的两个实例?
- java - Spring - 两种不同的 POST 方法,具有相同的 URL,但生成的内容类型不同
- php - 如何使用 PHPMailer 修复 SMTP 身份验证邮件进入垃圾邮件
- php - 概念问题:如何使用 PHP 检索数据并将其发送到外部应用程序
- reinforcement-learning - 如何管理深度强化学习中的长期事件?
- excel - 将日期转换为 UNIX 时间戳 excel vba
- design-patterns - 如何在不覆盖模块名称的情况下使用变量名称?
- twilio - Twilio Studio HTTP 发布请求标头
- amazon-ec2 - AWS .pem 文件在使用后存储在我的本地计算机上的什么位置?