如何在 2 个不同的 class 之间等待接收结果:
How to wait for receiving result between 2 different class:
我的程序有两个 classes 1 和 2。我的程序有一个菜单,在第一个 Class (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);
}
}
}
在class 1,我使用openMenu
函数打开程序菜单。程序应在 openMenu
函数中等待 class 2 中的关闭菜单命令,以导出.. class 2 中关闭菜单的命令使用 dispatchTouchEvent
导出功能。
现在,我的问题是:如何在 class 1 的 openMenu
函数中接收关闭菜单命令来关闭它?
EventBus 可能会帮助您实现这一目标。
它是这样工作的
为每个动作创建自定义事件,订阅者将相应地采取行动。 Check out this article
我的问题通过这 5 个步骤解决了:
1.创建接口:
我这样创建 OnCloseMenuListener
界面:
interface OnCloseMenuListener {
void setOnCloseMenu();
}
2。在Class1中实现接口:
在Class1
中,我实现了这个接口:
public class Class1 extends AppCompatActivity implements OnCloseMenuListener
3。覆盖 setOnCloseMenu
方法:
在 Class1 中,我覆盖了接口的 setOnCloseMenu
方法 class:
@Override
public void setOnCloseMenu() {
Log.e("<<O>>", "The menu closed...");
}
4。创建CloseMenu
方法:
我在 Class1
中创建了这个 static
方法,当菜单在 Class2
中关闭时,它调用了:
public static void CloseMenu(OnCloseMenuListener close, boolean isClose) {
if (isClose)
close.setOnCloseMenu();
}
}
5.在 Class2
中调用 CloseMenu
:
在Class2
的dispatchTouchEvent
方法中,当条件为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);
}
}
希望对后来遇到这个问题的人有用
我的程序有两个 classes 1 和 2。我的程序有一个菜单,在第一个 Class (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);
}
}
}
在class 1,我使用openMenu
函数打开程序菜单。程序应在 openMenu
函数中等待 class 2 中的关闭菜单命令,以导出.. class 2 中关闭菜单的命令使用 dispatchTouchEvent
导出功能。
现在,我的问题是:如何在 class 1 的 openMenu
函数中接收关闭菜单命令来关闭它?
EventBus 可能会帮助您实现这一目标。
它是这样工作的
为每个动作创建自定义事件,订阅者将相应地采取行动。 Check out this article
我的问题通过这 5 个步骤解决了:
1.创建接口:
我这样创建 OnCloseMenuListener
界面:
interface OnCloseMenuListener {
void setOnCloseMenu();
}
2。在Class1中实现接口:
在Class1
中,我实现了这个接口:
public class Class1 extends AppCompatActivity implements OnCloseMenuListener
3。覆盖 setOnCloseMenu
方法:
在 Class1 中,我覆盖了接口的 setOnCloseMenu
方法 class:
@Override
public void setOnCloseMenu() {
Log.e("<<O>>", "The menu closed...");
}
4。创建CloseMenu
方法:
我在 Class1
中创建了这个 static
方法,当菜单在 Class2
中关闭时,它调用了:
public static void CloseMenu(OnCloseMenuListener close, boolean isClose) {
if (isClose)
close.setOnCloseMenu();
}
}
5.在 Class2
中调用 CloseMenu
:
在Class2
的dispatchTouchEvent
方法中,当条件为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);
}
}
希望对后来遇到这个问题的人有用