1

我正在尝试使用 MediaController 并对其进行更改,以使其在 3 秒后不会消失。我在一个相关问题中找到了这段代码,我正在使用它:

mediaController = new MediaController(this) {   
    @Override
    public void hide()
    {
        mediaController.show();
    }
};

此代码有效,但是当活动停止时(使用后退按钮),我从以下代码中 show(0) 语句中添加的视图中收到有关泄漏窗口的日志错误:

public void onPrepared(MediaPlayer mediaPlayer) {

    mediaController.setMediaPlayer(this);
    mediaController.setAnchorView(findViewById(R.id.audio_control));

    handler.post(new Runnable() {
      public void run() {
        mediaController.setEnabled(true);
        mediaController.show(0);
      }
    });
}

在我看来,通过简单地调用 show 方法来覆盖 hide 方法意味着 hide 方法在完成活动时没有执行所需的操作。我必须覆盖其他必要的功能,比如隐藏控制器!

我想在必要时隐藏控制器(例如在完成它时),但不是在 3 秒后它被简单地隐藏(并且活动没有完成)的情况下。

或者也许我应该让控制器在 3 秒后一直消失,但我不确定我是否理解它为什么会以这种方式实现。对我来说,一直把它放在那里似乎更好。

4

1 回答 1

1

这是 MediaController 中的一个错误:

private View.OnClickListener mPauseListener = new View.OnClickListener() {
    public void More ...onClick(View v) {
        doPauseResume();
        show(sDefaultTimeout);
    }
};

有两种方法可以解决这个问题。

A)覆盖hide()方法:

class MyMediaController extends MediaController {
    @Override
    public void hide() {
        // Nope, do not hide. Call hideActually() to actually hide. 
    }

    public void hideActually() {
        super.hide();
    }
}

B)覆盖show()方法:

class MyMediaController extends MediaController {
    public int mTimeout = 0;

    @Override
    public void show() {
        show(mTimeout);
    }

    @Override
    public void show(int timeout) {
        super.show(mTimeout);
    }
}

覆盖该hide()方法可以让您完全控制隐藏 MediaController,但您必须确保hideActually()在销毁 Activity 之前调用,否则您将收到有关泄漏窗口的这些日志错误。

毕竟,覆盖这些show()方法使您有机会设置超时。在这种情况下,MediaController 将隐藏一些事件而不hide()显式调用该方法,即当用户按下后退按钮时。

就个人而言,我更喜欢混合使用两种实现:

class MyMediaController extends MediaController {
    public int mTimeout = 0;

    @Override
    public void show() {
        show(mTimeout);
    }

    @Override
    public void show(int timeout) {
        super.show(mTimeout);
    }

    @Override
    public void hide() {
        // Do not hide until a timeout is set 
        if (mTimeout > 0) super.hide();
    }

    public void hideActually() {
        super.hide();
    }
}

在这种情况下,您可以完全控制何时显示和隐藏 MediaController mTimeout = 0,但是当您实际设置超时时,您会获得 MediaController 的“正常”行为。

于 2014-02-13T09:44:33.493 回答