【问题标题】:Problem with back button in VideoViewVideoView中的后退按钮问题
【发布时间】:2011-08-26 15:41:24
【问题描述】:

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

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();

    }

}

【问题讨论】:

标签: android back android-videoview


【解决方案1】:

您可以简单地编写:(无需为 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);
        }
    });

【讨论】:

  • 看来 VideoView 消耗了 ACTION_DOWN 事件,因此 ACTION_UP 永远不会触发到 dispatchKeyEvent()。这可以通过在 KEYCODE_BACK 的 ACTION_DOWN 上返回 false 而不是调用超级来轻松解决。 (但请确保允许所有其他 KeyCode 调用超级!)
【解决方案2】:

您需要创建一个自定义 MediaController 类并重写 dispatchKeyEvent 函数以捕获返回的 KeyEvent 并告诉 Activity 完成。

请参阅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);
    }
}

【讨论】:

    【解决方案3】:

    来自 CommansWare

    根据源代码,这应该可以工作:

    1. 扩展 MediaController(出于本答案的目的,将其称为 RonnieMediaController)
    2. 在 RonnieMediaController 中覆盖 dispatchKeyEvent()
    3. 在链接到超类之前,检查 KeyEvent.KEYCODE_BACK, 如果遇到这种情况,请告诉您的活动完成()
    4. 使用 RonnieMediaController 而不是 MediaController 视频视图

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

    Here is the link to the original post.

    【讨论】:

      【解决方案4】:

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

      我记得通过将“return”放在适当的位置来解决这个问题。

      【讨论】:

      • 我觉得问题在于后按只是取消了视频视图,而活动又重新启动了视频视图。我似乎也无法覆盖这个...棘手
      • 这根本不是一个有效的陈述。
      • finish(): "当你的 Activity 完成并且应该关闭时调用它。ActivityResult 被传播回通过 onActivityResult() 启动你的人。"
      【解决方案5】:
      public boolean onKeyDown(int keyCode, KeyEvent event) {
          if (keyCode == KeyEvent.KEYCODE_BACK) {
              System.exit(0);
          }
      
          return false;
      }
      

      【讨论】:

      • System.exit() 是 Android 上的反模式。
      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多