Как ждать получения результата между 2 разными классами: - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть программа с двумя классами 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.

        }
}

И это id моего 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, чтобы закрыть это?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

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

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

0 голосов
/ 01 сентября 2018

EventBus может помочь вам достичь этого.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...