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