#java #android #android-recyclerview #view #dialog
#java #Android #android-recyclerview #Вид #диалоговое окно
Вопрос:
У меня есть диалоговое окно, которое я настроил на воспроизведение видео в полноэкранном режиме при нажатии кнопки в recyclerview.Поэтому всякий раз, когда я нажимаю полноэкранную кнопку на видеоплеере, он разбивается с IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Я не хочу удалять view из recyclerview, потому что, когда я добавляю обратно тот же вид, он перекрывает элементы в recyclerview. Итак, я создал новый экземпляр видеоплеера и передал его addContentView
методу dialog, но он выдает ту же ошибку.
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:
Я не нашел проблему в вашем коде, но не лучше ли создать полноэкранное действие? Вы можете создать класс фрагмента для обработки exoplayer, затем вам просто нужно увеличить его в своем полноэкранном макете и в вашем recyclerview.
Вам просто нужно установить дополнительные параметры с фактической позицией видео, когда пользователь нажимает на recyclerview, не забудьте установить полноэкранный стиль в теге вашей полноэкранной активности в вашем файле манифеста.
Комментарии:
1. Да, но нашим требованием является диалоговое окно всякий раз, когда я пытаюсь открыть полноэкранный диалог, я получаю указанное выше исключение
2. вы уже пытались изменить метод view before initFullscreenDialog?
3. если я удалю view, то при возвращении обратно в recylcerview это испортит макет представления recycler