我正在为Android设计一款具有弹出控件功能的音乐播放器应用。我目前正试图在一段时间不活动后关闭这些控件,但似乎并没有一个明确记录的方法。到目前为止,我已经设法使用本网站和其他人的一些建议来拼凑以下解决方案。
private Timer originalTimer = new Timer();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.playcontrols);
View exitButton = findViewById(R.id.controls_exit_pane);
exitButton.setOnClickListener(this);
View volUpButton = findViewById(R.id.controls_vol_up);
volUpButton.setOnClickListener(this);
View playButton = findViewById(R.id.controls_play);
playButton.setOnClickListener(this);
View volDownButton = findViewById(R.id.controls_vol_down);
volDownButton.setOnClickListener(this);
musicPlayback();
originalTimer.schedule(closeWindow, 5*1000); //Closes activity after 10 seconds of inactivity
}
应该关闭窗口的代码
//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
closeWindow.cancel(); //not sure if this is required?
originalTimer.cancel();
originalTimer.schedule(closeWindow, 5*1000);
}
private TimerTask closeWindow = new TimerTask() {
@Override
public void run() {
finish();
}
};
上面的代码对我来说非常有意义,但强制关闭任何用户交互。然而,如果我没有接触并且如果我删除了第二个时间表,则在交互之后不会关闭,所以这似乎是问题所在。另请注意,我想我会将此计时任务移动到另一个线程,以帮助保持UI的快节奏。我需要先让它工作:D。如果还有我需要提供的更多信息,请询问并感谢您的帮助......你们很棒!
答案 0 :(得分:11)
基于@ CommonsWare的建议,切换到Handler。完美的工作。非常感谢!
private final int delayTime = 3000;
private Handler myHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.playcontrols);
View exitButton = findViewById(R.id.controls_exit_pane);
exitButton.setOnClickListener(this);
View volUpButton = findViewById(R.id.controls_vol_up);
volUpButton.setOnClickListener(this);
View playButton = findViewById(R.id.controls_play);
playButton.setOnClickListener(this);
View volDownButton = findViewById(R.id.controls_vol_down);
volDownButton.setOnClickListener(this);
musicPlayback();
myHandler.postDelayed(closeControls, delayTime);
}
和其他方法......
//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
myHandler.removeCallbacks(closeControls);
myHandler.postDelayed(closeControls, delayTime);
}
private Runnable closeControls = new Runnable() {
public void run() {
finish();
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
};
答案 1 :(得分:0)
要完成上述答案,请注意只有在关注点击时,Activity.onUserInteraction()才足够。
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction%28%29处的文档说明:“请注意,此触控将针对触摸手势开始触摸操作调用,但触摸移动和触摸操作可能无法调用接下来。“
实际的实施证明它确实忽略了平板电脑上的所有动作,这意味着时钟永远不会被重置,例如,在不松开手指的情况下进行绘图。另一方面,它也意味着时钟不会经常复位,这限制了开销。