gpt4 book ai didi

android - 带有系统警报窗口的后退事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:25:41 24 4
gpt4 key购买 nike

我需要在按下 backhome 按钮事件时关闭系统警报窗口。我尝试使用 onKeyEvent 但没有成功。由于我们无法捕获服务中的 back 按下事件,如何实现?

最佳答案

因为它是托管覆盖窗口的服务,所以这是一个有点棘手的解决方案,但它是可能的。

您应该分别处理这两种情况(覆盖主页按钮按下和后退按钮按下)。


<强>1。覆盖主页按钮按下:

创建这个 HomeWatcher 类,其中包含一个 BroadcastReceiver,当按下主页按钮时会发出通知。仅当您的窗口出现时才注册此接收器。

Android: associate a method to home button of smartphone

在你的服务 onCreate 方法中使用这个:

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
@Override
public void onHomePressed() {
yourWindow.hide() //means: windowManager.removeView(view);
}
@Override
public void onHomeLongPressed() {
}
});
mHomeWatcher.startWatch();

<强>2。覆盖后退按钮按下:

想法是创建一个空布局作为窗口类的数据成员,并将您的 View 附加到它(即使它是一个膨胀的 XML 布局)。

例如,这将是您的窗口类:

public class MyWindow
{
private WindowManager windowManager;
private WindowManager.LayoutParams params;
private View view;

// Add this empty layout:
private MyLayout myLayout;

public MyWindow()
{
windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.your_original_window_layout, null);

// Add your original view to the new empty layout:
myLayout = new MyLayout(this);
myLayout.addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}

// And show this layout instead of your original view:
public void show()
{
windowManager.addView(myLayout, params);
}

public void hide()
{
windowManager.removeView(myLayout);
}
}

现在创建 MyLayout 类来覆盖后退按钮按下:

public class MyLayout extends LinearLayout
{
private MyWindow myWindow;

public MyLayout(MyWindow myWindow)
{
super(myWindow.context);

this.myWindow = myWindow;
}


@Override public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
{
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0)
{
getKeyDispatcherState().startTracking(event, this);
return true;

}

else if (event.getAction() == KeyEvent.ACTION_UP)
{
getKeyDispatcherState().handleUpEvent(event);

if (event.isTracking() && !event.isCanceled())
{
// dismiss your window:
myWindow.hide();

return true;
}
}
}

return super.dispatchKeyEvent(event);
}
}

我知道这有点复杂,因为它是由服务托管的系统警报窗口,但它正在运行。我也有同样的问题,并且已经完全解决了。祝你好运。

关于android - 带有系统警报窗口的后退事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30861075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com