У меня есть программа с двумя классами 1 и 2. В моей программе есть меню, которое открывается и закрывается в первом классе (1).
Это Class1:
public class Class1 extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// This function open menu correctly.
openMenu();
}
});
}
private void openMenu() {
drawerLayout.openDrawer(GravityCompat.START);
// The openDrawer function in class 2 opens the menu.
// When it's closed in class 2, notify Class 1 here.
}
}
И этот идентификатор мой Class2:
public class Class2 extends DrawerLayout {
public void openDrawer(View drawerView) {
super.openDrawer(drawerView);
currentSideBar = (SideBarWithBg) drawerView;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
y = ev.getY();
if (y > 400) {
closeDrawers();
// Notice to class 1 that the menu is closed.
...
return super.dispatchTouchEvent(ev);
}
}
}
В классе 1 я открываю меню программы с помощью функции openMenu
. Программа должна ожидать в функции openMenu
команду закрытия меню в классе 2, чтобы экспортировать. Команда закрытия меню в классе 2 экспортируется с использованием функции dispatchTouchEvent
.
Теперь, мой вопрос:. Как я могу получить команду закрытия меню в функции openMenu
класса 1, чтобы закрыть это?
EventBus может помочь вам в этом.
Создайте собственное событие для каждого действия, и подписчики будут действовать соответственно. Прочтите эту статью
Моя проблема решена с помощью этих 5 шагов:
1. Создайте интерфейс:
Я создаю интерфейс OnCloseMenuListener
следующим образом:
interface OnCloseMenuListener {
void setOnCloseMenu();
}
2. Включите интерфейс в Class1:
В Class1
я реализую этот интерфейс:
public class Class1 extends AppCompatActivity implements OnCloseMenuListener
3. Переопределите метод setOnCloseMenu
:
В Class1 я переопределяю метод setOnCloseMenu
моего класса интерфейса:
@Override
public void setOnCloseMenu() {
Log.e("<<O>>", "The menu closed...");
}
4. Создайте метод CloseMenu
:
Я создаю этот метод static
в Class1
, при закрытии меню в Class2
он вызывал:
public static void CloseMenu(OnCloseMenuListener close, boolean isClose) {
if (isClose)
close.setOnCloseMenu();
}
}
5. Вызов CloseMenu
в Class2
:
В методе dispatchTouchEvent
Class2
, когда условие было true
и меню закрыто, я запускаю Class1
, используя метод CloseMenu
:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
y = ev.getY();
if (y > 400) {
closeDrawers();
// This code notify Class1
Class1.CloseMenu(new Class1(),true);
return super.dispatchTouchEvent(ev);
}
}
Надеюсь, он будет полезен тем, кто столкнулся с этой проблемой позже.