首页 > 解决方案 > 从界面覆盖 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();
        }
    }

}

我的问题是我收到错误isTaskRootonBackPressed说以下内容:

Cannot resolve method 'isTaskRoot' in 'customBackPressed'

Cannot resolve method 'onBackPressed' in 'Object'

有人可以向我解释如何解决这个问题吗?

谢谢

标签: javaandroidinterfaceonbackpressed

解决方案


你不应该用接口方法来表示行为,你应该用整个接口来表示它。

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 { ... }


推荐阅读