在我的应用中,我使用导航抽屉(在片段A中)导航到片段:
public void displayView(int viewId){
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (viewId) {
case R.id.nav_menu:
fragment = new MenuFragment();
title = getString(R.string.menu_title);
viewIsAtHome = false;
break;
case R.id.nav_reservation:
fragment = new ReservationFragment();
title = getString(R.string.reservation_title);
viewIsAtHome = false;
break;
...
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
}
// set the toolbar title
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(title);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
}
在displayView()
中调用{p> onNavigationItemSelected
:
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
displayView(item.getItemId());
return true;
}
现在,在ReservationFragment中,我显示一个预订列表和一个FloatingActionButton来启动活动B,如果没有预订,用户可以添加预订。当用户完成添加预订时,我想在预留片段中显示它。这需要我“回到”片段。我如何实现这一点,因为活动B对活动A一无所知?
我尝试了什么:
我尝试在活动A中创建一个方法,如下所示:
public void navigateToFragment(int viewId) {
displayView(R.id.nav_reservation);
}
然后从活动B调用此方法:
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MainActivity().navigateToFragment(R.id.nav_reservation);
//MainActivity is Activity A
}
});
该应用因该行nullPointerException
中的displayView()
而崩溃:
String title = getString(R.string.app_name);
这并不奇怪,因为我创建了一个新的MainActivity对象,它对Activity的先前状态一无所知,对吧?
此question反映了我的问题,但基于Settings
,所以我无法真正使用我的答案。
我如何完成这项任务?
答案 0 :(得分:1)
我想到了三种快速方法。首先,您可以使用startActivityForResult启动activityB,并在用户在activityB中执行他想要的操作后处理activityA中的结果。其次,您可以将activityA设置为singleTop,在完成activityB之前,您可以使用clearTop startActivityA和一个名为clear_top(https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP)的意图标志。 最后但并非最不重要的是,您可以通过在两个活动中绑定服务来连接两个活动,并通过您绑定的服务进行通信。