从活动B

时间:2016-11-03 09:18:33

标签: java android android-fragments android-navigation-drawer

在我的应用中,我使用导航抽屉(在片段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,所以我无法真正使用我的答案。 我如何完成这项任务?

1 个答案:

答案 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)的意图标志。 最后但并非最不重要的是,您可以通过在两个活动中绑定服务来连接两个活动,并通过您绑定的服务进行通信。