java - 从界面覆盖 onBackPressed
问题描述
我在我的应用程序中多次使用该onBackPressed
方法。
我想覆盖它,所以它每次都会检查活动是否是根活动,以便显示一个对话框,说“你确定要退出吗?”
由于我在我的应用程序中多次使用它,我想创建一个界面并将其放置在那里。
我是使用接口的新手,但我尝试了以下方法:
public interface App_Interfaces {
void BackPressed(Context contect);
}
class customBackPressed implements App_Interfaces{
@Override
public void BackPressed(Context context) {
if(isTaskRoot()){
final Dialog dialog = new Dialog( context );
dialog.setContentView( R.layout.are_you_sure );
dialog.getWindow().setBackgroundDrawable( new ColorDrawable( Color.TRANSPARENT ) );
if (!((Activity) context).isFinishing()) {
dialog.show();
}
}else{
super.onBackPressed();
}
}
}
我的问题是我收到错误isTaskRoot
并onBackPressed
说以下内容:
Cannot resolve method 'isTaskRoot' in 'customBackPressed'
Cannot resolve method 'onBackPressed' in 'Object'
有人可以向我解释如何解决这个问题吗?
谢谢
解决方案
你不应该用接口方法来表示行为,你应该用整个接口来表示它。
public interface OnBackPressedListener {
void onBackPressedEvent()
}
然后,您应该将此行为附加到活动/片段/视图根。例如:
public class MyActivity extends Activity implements OnBackPressedListener {
// Initialize your activity's fields
private boolean isTaskRoot() {
// implement your task root method
}
@Override
public void onBackPressed() { // This method is provided by activity "from the box".
onBackPressedEvent();
}
@Override
public void onBackPressedEvent() {
if(isTaskRoot()) {
final Dialog dialog = new Dialog(this);
dialog.setContentView( R.layout.are_you_sure );
dialog.getWindow().setBackgroundDrawable( new ColorDrawable( Color.TRANSPARENT ) );
if (!this.isFinishing()) {
dialog.show();
}
}
}
}
请注意,您的onBackPressedListener
界面不应依赖于任何其他方法、行为。它的主要目的是提供一种将类标记为类的能力,它可以对 onBackPressed 事件做出反应。
一种可能的用法是继承您的片段onBackPressedListener
,然后onBackPressedEvent
在通知父 Activity 按下后退按钮时调用它们的方法。
@Override
public void onBackPressed() {
// ...
if (currFragment instanceof onBackPressedListener) {
currFragment.onBackPressedEvent();
}
// ...
}
UPD:如果您想为所有继承的类提供即用型行为,onBackPressedListener
您可以使用default
关键字来创建默认接口方法。
public interface onBackPressedListener() {
boolean isTaskRoot()
default void onBackPressedEvent() {
// Your implementation.
// It should not contain calls of methods, which are not presented by this interface.
if (isTaskRoot()) // ...
}
}
或者您可以创建BaseActivity
类,您onBackPressedEvent
将从界面覆盖其中
public class BaseActivity extends Activity implements OnBackPressedListener {
@Override
public void onBackPressed() {
...
}
}
然后你从它继承你的活动 public class MyActivity extends BaseActivity { ... }
推荐阅读
- android - 如何在ActivityResult上毫无疑问地对文件内容进行编码?
- amazon-web-services - 经典负载均衡器是否会被 aws 停用
- sql - 如何从具有多个外键的两个不同表中进行选择
- ruby-on-rails - 在rails上添加最喜欢的按钮ruby
- amazon-web-services - 当我对等不同区域的两个 VPC 时,流量是否会通过公共 Internet?
- python - 如何将视频(例如缩放通话)裁剪成多个文件?
- javascript - .forEach(...) 在获取时未定义
- html - 使用输入删除 mat-form-field 的边框(也用于悬停和焦点)
- javascript - 带有条件输出/应用的 Javascript 数组过滤器
- java - 在 java 程序中使用来自 hub.KerasLayer 和 python 和 tensorflow 2.1.0 的模型时,“图中没有名为 [input] 的操作”