Диалог в Recyclerview - IllegalStateException: указанный дочерний элемент уже имеет родителя - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть диалоговое окно, которое я установил для воспроизведения видео в полноэкранном режиме при нажатии кнопки в программе recyclerview. Поэтому всякий раз, когда я нажимаю на полноэкранную кнопку на видео-плеере, он вылетает с IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Я не хочу удалять представление из recyclerview, потому что, когда я добавляю обратно то же самое представление, оно перекрывает элементы в recyclerview. Поэтому я создал новый экземпляр Video player и передал его методу диалога 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

1 Ответ

0 голосов
/ 22 апреля 2019

Я не нашел проблемы в вашем коде, но не лучше ли создать полноэкранный режим?Вы можете создать класс фрагмента для обработки exoplayer, тогда вам просто нужно надуть его в полноэкранном макете и в своем обзоре реселлера.
Вам просто нужно установить дополнения с фактической позицией видео, когда пользователь щелкает по представлению реселлера,не забудьте установить полноэкранный стиль в теге вашей полноэкранной активности в файле манифеста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...