微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从接口重写onBackPressed

如何解决从接口重写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'

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

谢谢

解决方法

您不应通过界面方法来表示行为,而应通过整个界面来表示。

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继承片段,然后在通知父Activity按下返回按钮的情况下调用其onBackPressedEvent方法。

@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() {
    ...
    }
}

然后您从中继承活动 公共类MyActivity扩展了BaseActivity {...}

,

我不确定...但是我认为从完全不同的类中的另一个类中调用一个方法而不导入或引用它是错误的。

您的方法:

'isTaskRoot'

来自另一个您未提供相关信息的班级,而您的班级:

customBackPressed

不包含任何具有该名称的方法。

我认为,有一种方法可以通过界面访问方法...您应该尝试并找到方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。