Переключиться обратно в SupportMapFragment отображает пустую активность

У меня есть проблема фрагмента SuportMap, в то время как он отображает пустой фрагмент, когда я переключаюсь обратно на фрагмент карты, и это ситуация:
I have Main activity with left drawer, the drawer contains tow items to display fragment A and fragment B, Fragment A containing tab host with 2 tabs (map tab and second Tab).
приложение отображает карту на обед, и это нормально, но если я выберу второй элемент в ящике, чтобы перейти к фрагменту B, и обратно к фрагменту A, фрагмент карты отображает пустой фрагмент, и если я выберу другую вкладку и обратно на вкладку Карты, то он отображает карту снова успешно. и я не знаю, что не так.

MainActivity:

public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();

MainFragment mainFragment = (MainFragment) getSupportFragmentManager().findFragmentByTag(MainFragment.TAG);

if (id == R.id.nav_home && mainFragment == null) {
    showFragment(new MapFragment(), "MapFragment");
} else if (id == R.id.nav_gallery &&
      getSupportFragmentManager().findFragmentByTag(GalleryFragment.TAG) == null) {
    showFragment(new B(), "B");
}

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
assert drawer != null;
drawer.closeDrawer(GravityCompat.START);
return true;
}

public void showFragment(Fragment fragment, String tag) {
        FragmentManager manager = getSupportFragmentManager();
        boolean fragmentPopped = manager.popBackStackImmediate(tag, 0);

    if (!fragmentPopped) { //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.content, fragment);
        ft.addToBackStack(tag);
        ft.commit();
    }
}

Фрагмент A:

private void initTabHost() {
    mTHost.setOnTabChangedListener(this);
    mTHost.setup();

    TabHost.TabSpec MapSpec = mTHost.newTabSpec(PeopleFragment.TAG);
    MapSpec.setIndicator(getTabIndicator(R.string.tool_bar_people, R.drawable.selector_map_tab));
    MapSpec.setContent(new DummyTabContent(getActivity()));
    mTHost.addTab(MapSpec);

    TabHost.TabSpec secondSpec = mTHost.newTabSpec(SecondFragment.TAG);
    secondSpec.setIndicator(getTabIndicator(R.string.tool_bar_news, R.drawable.selector_second_tab));
    secondSpec.setContent(new DummyTabContent(getActivity()));
    mTHost.addTab(secondSpec);
}

private View getTabIndicator(int title, int icon) {
    View view = LayoutInflater.from(getActivity()).inflate(R.layout.item_tab_layout, null);

    ImageView ivIcon = (ImageView) view.findViewById(R.id.iv_icon);
    ivIcon.setImageResource(icon);

    TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
    tvTitle.setText(title);

    return view;
}

@Override
public void onTabChanged(String tabId) {
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    MapFragment mapFragment = (MapFragment) fragmentManager.findFragmentByTag(MapFragment.TAG);
    SecondFragment secondFragment = (SecondFragment) fragmentManager.findFragmentByTag(SecondFragment.TAG);

    if (mapFragment != null) {
        fragmentTransaction.detach(mapFragment);
    }
    if (secondFragment != null) {
        fragmentTransaction.detach(secondFragment);
    }

    if (tabId.equalsIgnoreCase(MapFragment.TAG)) {
        if (mapFragment == null) {
            fragmentTransaction.add(R.id.fl_real_tab_content, new MapFragment(), MapFragment.TAG);
        } else {
            fragmentTransaction.attach(mapFragment);
        }
    } else if (tabId.equalsIgnoreCase(SecondFragment.TAG)) {
        if (secondFragment == null) {
            fragmentTransaction.add(R.id.fl_real_tab_content, new SecondFragment(), SecondFragment.TAG);
        } else {
            fragmentTransaction.attach(SecondFragment);
        }
    }
    fragmentTransaction.commit();
}

MapFragment:

@Override
public void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}
public void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the mMap.
    ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
            .getMapAsync(this);
}

Любая помощь что я должен сделать и в чем проблема?

1 ответ

  1. Я исправил эту проблему в обходном решении путем добавления android:launchMode=="SingleInstance"к действию в файле манифестов.
    в этом случае, когда мы вернемся к действию, то действие не будет создавать новые фрагменты и сбрасывать состояния с первого.