VideoView中的后退按钮问题

时间:2011-08-26 15:41:24

标签: android back android-videoview

我很难按下后退键实际完成我的活动。我正在运行一个非常简单的视频,使用progressdialog来显示加载对话框和onpreparedlistener等等简单的东西。无论如何,目前当我按下后退按钮时,它将取消progressdialog,并留下黑屏,然后再次按下,progressdialog重新启动!然后当我再次单击后退按钮时,它会显示一个警告对话框,“视频无法播放”。很烦人。谢谢你的帮助。

public class VideoActivity extends Activity {

    private VideoView mVideoView;

    private static ProgressDialog progressdialog;
    private String path;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.videoview);


        progressdialog = ProgressDialog.show(this, "", " Video Loading...", true);
        progressdialog.setCancelable(true);

        mVideoView = (VideoView) findViewById(R.id.surface_view);
        mVideoView.setMediaController(new MediaController(this));
        Bundle b = this.getIntent().getExtras();
        path = b.getString("path");
        mVideoView.setVideoURI(Uri.parse(path));


        mVideoView.setOnPreparedListener(new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                progressdialog.dismiss();
                mVideoView.requestFocus();
                mVideoView.start();

            }
        });

    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();

        super.finish();

    }

}

5 个答案:

答案 0 :(得分:14)

你可以简单地写:(不需要为MediaController创建新类)

mVideoView.setMediaController(new MediaController(this){
        public boolean dispatchKeyEvent(KeyEvent event)
        {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                ((Activity) getContext()).finish();

            return super.dispatchKeyEvent(event);
        }
    });

答案 1 :(得分:2)

您需要创建一个自定义MediaController类并覆盖dispatchKeyEvent函数以捕获后面的KeyEvent并告诉活动完成。

有关详细信息,请参阅Android back button and MediaController

public class CustomMediaController extends MediaController {
    public CustomMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }

    public CustomMediaController(Context context) {
        super(context, true);
    }

    public boolean dispatchKeyEvent(KeyEvent event)
    {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
            ((Activity) getContext()).finish();

        return super.dispatchKeyEvent(event);
    }
}

答案 2 :(得分:0)

  

来自CommansWare

     

根据源代码,这应该有效:

     
      
  1. 扩展MediaController(出于此答案的目的,请调用它   RonnieMediaController)
  2.   
  3. 覆盖RonnieMediaController中的dispatchKeyEvent()
  4.   
  5. 在链接到超类之前,检查KeyEvent.KEYCODE_BACK,   如果遇到这种情况,请告诉您的活动完成()
  6.   
  7. 使用RonnieMediaController代替MediaController   VideoView
  8.         

    就个人而言,我只是不管它,因为这会改变你的用户   无法让RonnieMediaController按需消失。

Here is the link to the original post.

答案 3 :(得分:-2)

finish()不会杀死你的活动,它只是向Android发出信号,表示它不再需要运行Activity。

我记得通过在适当的地方放置“返回”来解决这个问题。

答案 4 :(得分:-2)

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        System.exit(0);
    }

    return false;
}