переопределить onBackPressed из интерфейса

#java #android #interface #onbackpressed

#java #Android #интерфейс #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'
  

Может кто-нибудь, пожалуйста, объяснить мне, как работать, чтобы решить эту проблему?

Спасибо

Комментарии:

1. Как вы планируете это использовать customBackPressed ? этот класс не является an, Activity поэтому, конечно, у него нет методов isTaskRoot и onBackPressed

2. Вы понимаете, что такое isTaskRoot ? Это не ошибка, потому что не удается получить taskroot, я предполагаю, что в данном случае значение isTaskRoot равно нулю

3. Вы можете создать BaseActivity и ввести в него свой логин, все ваши действия должны расширять базовую активность. Я не понял преимущества интерфейса и пользовательского класса обратного нажатия, который вы создали

4. интерфейс используется для абстрактного кода, поэтому он не будет отображаться много раз в коде, нет? это то, что я пытаюсь сделать

Ответ №1:

Вы не должны представлять поведение методом интерфейса, вы должны представлять его всем интерфейсом.

 public interface OnBackPressedListener {
    void onBackPressedEvent()
}
  

И затем вы должны привязать это поведение к корню activity / fragment / view.
Например:

 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 методы, когда родительская активность уведомляется о том, что была нажата кнопка возврата.

 @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 { … }

Комментарии:

1. Но, насколько я понимаю, мне нужно написать код переопределения onBackPressed в любом классе, который я использую в своем приложении, нет? Я пытаюсь переопределить его в одном месте и использовать во всех своих классах

2. Да, я думаю, что последний вариант — это то, что я сделаю, спасибо, приятель

Ответ №2:

Я не уверен… но я думаю, что неправильно вызывать метод из другого класса в совершенно другом классе без импорта или ссылки на него.

ваш метод:

 'isTaskRoot'
  

происходит из другого класса, о котором вы не предоставили информацию, и вашего класса:

 customBackPressed
  

не содержит никакого метода с таким именем.

Я думаю, что есть способ предоставить доступ к методам через интерфейс… Вы должны попытаться найти как.