Как дождаться получения результата между двумя разными классами:

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

0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

EventBus может помочь вам в этом.

Вот как это работаетHow EventBus works

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

Ответ принят как подходящий

Моя проблема решена с помощью этих 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:

В методе dispatchTouchEventClass2, когда условие было 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);
    }
} 

Надеюсь, он будет полезен тем, кто столкнулся с этой проблемой позже.

Другие вопросы по теме