Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Recyclerview-IllegalStateException中的对话框:指定的子级已具有父级_Java_Android_Android Recyclerview_View_Dialog - Fatal编程技术网

Java Recyclerview-IllegalStateException中的对话框:指定的子级已具有父级

Java Recyclerview-IllegalStateException中的对话框:指定的子级已具有父级,java,android,android-recyclerview,view,dialog,Java,Android,Android Recyclerview,View,Dialog,我有一个对话框,我将其设置为在recyclerview中单击按钮时全屏播放视频。因此,每当我点击视频播放器上的全屏按钮时,它就会崩溃,出现IllegalStateException:指定的子项已经有父项。必须首先对孩子的家长调用removeView()。 我不想从recyclerview中删除视图,因为当我在recyclerview上添加相同的视图时,它会重叠项目。因此,我创建了新的视频播放器实例,并将其交给dialog的addContentView方法,但它给出了相同的错误 public cl

我有一个对话框,我将其设置为在recyclerview中单击按钮时全屏播放视频。因此,每当我点击视频播放器上的全屏按钮时,它就会崩溃,出现
IllegalStateException:指定的子项已经有父项。必须首先对孩子的家长调用removeView()。

我不想从recyclerview中删除视图,因为当我在recyclerview上添加相同的视图时,它会重叠项目。因此,我创建了新的视频播放器实例,并将其交给dialog的
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();
            }
        };
    }
public类ExoPlayer\u Main{
公共静态最终字符串标记=“####ExoPlayer###”;
媒体资源媒体资源;
语境;
PlayerView PlayerView;
SimpleExoPlayer;
布尔playWhenReady=false;
长后卫位置;
int当前窗口;
int newPlayerState=1;
List mediaList=new ArrayList();
ComponentListener ComponentListener=新的ComponentListener();
专用静态最终DefaultBandwidthMeter带宽\ U米=新的DefaultBandwidthMeter();
私有框架布局MFullScreen按钮;
//全屏设置
ImageView mFullScreenIcon;
私有布尔值mExoPlayerFullscreen=false;
私人对话;
公共ExoPlayer_Main(上下文上下文,PlayerView PlayerView){
this.context=上下文;
this.playerView=playerView;
}
public void initializePlayer(Uri,int-mediaType){
Log.d(标记“Init Player Calling”);
if(player==null){
player=ExoPlayerFactory.newSimpleInstance(上下文);
player.clearVideoSurface();
player.addListener(componentListener);
player.setplaywhenredy(playwhenredy);
player.seekTo(当前窗口,播放位置);
player.clearVideoSurface();
mediaSource=buildMediaSourceNew(uri,mediaType);
playerView.setPlayer(player);
player.prepare(mediaSource);
initFullscreenButton();
}
}
私有void initFullscreenButton(){
PlayerControlView-controlView=playerView.findViewById(R.id.exo_控制器);
mFullScreenIcon=controlView.findViewById(R.id.exo_全屏_图标);
mFullScreenButton=controlView.findViewById(R.id.exo_全屏_按钮);
mFullScreenButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(!mExoPlayerFullscreen){
openFullscreenDialog();
}否则{
closeFullscreenDialog();
}
}
});
}
私有void openFullscreenDialog(){
initFullscreenDialog();
((视图组)playerView.getParent()).removeView(playerView);
player.setplaywhenrady(false);
mFullScreenDialog.addContentView(playerView,新建ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_父级,ViewGroup.LayoutParams.MATCH_父级));
mFullScreenIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_fullscreen_skrink));
mExoPlayerFullscreen=true;
mFullScreenDialog.show();
}
私有void closeFullscreenDialog(){
((视图组)playerView.getParent()).removeView(playerView);
FrameLayout playerAdd=((活动)上下文).findViewById(R.id.main\u media\u frame);
playerad.addView(playerView);
mExoPlayerFullscreen=false;
mFullScreenDialog.Disclose();
mFullScreenIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_fullscreen_expand));
}
私有void initFullscreenDialog(){
mFullScreenDialog=新建对话框(上下文,android.R.style.Theme\u Black\u NoTitleBar\u全屏){
public void onBackPressed(){
如果(mExoPlayerFullscreen)
closeFullscreenDialog();
super.onBackPressed();
}
};
}

我需要用我的视频播放器打开全屏对话框,当我关闭视频时,它不会弄乱我的
recyclerview
我没有在你的代码中找到问题,但是创建全屏活动不是更好吗?你可以创建一个片段类来处理exoplayer,然后你只需要在你的全屏布局和你的屏幕上放大它回收视图。

当用户单击recyclerview时,您只需将视频的实际位置设置为extras,别忘了在清单文件的全屏活动标记中设置全屏样式。

是的,但我们的要求是每当我尝试打开全屏对话框时都会显示对话框,我在上面看到,例外情况是您之前是否已尝试删除视图initFullscreenDialog方法?如果我删除视图,那么返回recylcerview时,它会弄乱回收器视图布局