Как закрыть активность VideoView (в настоящее время приходится дважды нажать назад)
У меня есть простая активность для предварительного просмотра видео в FullScreen. План деятельности:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:fillViewport="true">
<VideoView
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:scaleType="fitCenter"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/button_height"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:layout_alignParentBottom="true"
<Button android:id="@+id/buttonClose"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@null"
android:textSize="18sp"
android:textColor="@color/white"
android:text="@string/close"/>
</RelativeLayout>
</RelativeLayout>
Соответствующий код активности:
public class VideoFullscreenActivity extends Activity {
private VideoView video;
private Button closeButton;
private MediaController mediaController;
private boolean toClose;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_fullscreen);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);
video = (VideoView) findViewById(R.id.video);
closeButton = (Button) findViewById(R.id.buttonClose);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Log.d("VideoPreview", "onClick Close Button");
VideoFullscreenActivity.super.onBackPressed();
}
});
Bundle bundle = getIntent().getParcelableExtra("bundle");
if (bundle != null) {
Uri videoUri = bundle.getParcelable("data");
mediaController = new MediaController(this);
mediaController.setAnchorView(video);
video.setMediaController(mediaController);
video.setVideoURI(videoUri);
video.requestFocus();
video.start();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
finish();
}
return (super.onOptionsItemSelected(menuItem));
}
@Override
protected void onResume() {
Log.i("VideoPreview", "Resume");
video.resume();
super.onResume();
}
@Override
protected void onPause() {
Log.i("VideoPreview", "Pause");
video.suspend();
super.onPause();
}
@Override
protected void onDestroy() {
Log.i("VideoPreview", "Destroy");
video.stopPlayback();
super.onDestroy();
}
}
Когда я нажимаю кнопку "Закрыть" в первый раз, последовательность:
D/VideoPreview﹕ onClick Close Button
I/VideoPreview﹕ Pause
I/VideoPreview﹕ Resume
I/VideoPreview﹕ Destroy
На этом этапе действие не закрывается, оно перезапускается, и видео начинает воспроизводиться снова. Чтобы закрыть действие, я должен снова нажать кнопку "Закрыть".
Когда я нажимаю кнопку "Закрыть" во второй раз, последовательность:
D/VideoPreview﹕ onClick Close Button
I/VideoPreview﹕ Pause
I/VideoPreview﹕ Destroy
Теперь активность закрывается.
Некоторые важные вопросы, которые я нашел в Stackru:
- Android - VideoView требует дважды нажать НАЗАД, чтобы выйти (добавление функции onKeyDown не помогло)
- Как правильно закрыть Пейзаж VideoView Activity? (Я переопределил методы onDestroy, onResume и onPause, но это не решило проблему)
Может кто-нибудь объяснить мне, что я делаю неправильно (или не понимаю).
Спасибо
2 ответа
Код для закрытия активности был правильным. Проблема была в Деятельности, которая запустила VideoFullscreenActivity. Оскорбительный кусок кода был:
<VideoView
android:id="@+id/tag_attach_video"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="10dp"/>
VideoFullscreenActivity завершил вызов onBackPressed(), но VideoView в более раннем действии все еще был активным, что требовало повторного нажатия.
Я изменил VideoView на ImageView и использовал изображение-заполнитель, чтобы указать, что прикрепленные данные являются видео. Это решило проблему.
Вы можете вызвать активность finish(), чтобы принудительно закрыть активность