Потеря данных фрагмента Android

#android #fragment #android-webservice

#Android #фрагмент #android-веб-сервис

Вопрос:

Итак, у меня есть приложение с навигационным ящиком. Каждый пункт меню в ящике открывает другой фрагмент, который я показываю пользователю, и он отлично работает.

Один из этих фрагментов (DashboardClientFragment) вызывает веб-сервис в своем методе onCreateView(), а затем заполняет ViewPager. При первом запуске он загружает данные и отображается просто отлично.

Проблема начинается, когда я открываю ящик и нажимаю на тот же элемент, который снова открывает этот фрагмент. Фрагмент загружается, мой вызов веб-сервиса вызывается снова (он показывает ответ json от службы), но viewpager пуст.

Ниже приведены некоторые скриншоты проблемы:

первый экран — все в порядке

экран второй — открытие панели навигации и щелчок по пункту меню панели инструментов

третий экран — ошибка

Вот урезанная версия действия.

 public class DashboardActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dashboard);

    if (savedInstanceState == null) {
        displayView(1, false);
    }
}

public void displayView(int id, boolean addBackStack) {
    Fragment fragment = null;

    switch (id) {
    case 1:
        fragment = new DashboardClientFragment();
        break;
    case 2:
        fragment = new ClientsFragment();
        break;
    case 5:
        fragment = new StorefrontPreviewFragment();
        break;
    case 6:
        new SessionManager(this).logoutUser();
        startActivity(new Intent(this, MainActivity.class));
        finish();
        break;

    default:
        break;
    }

    if (fragment != null) {
        drawer.closeDrawers();

        FragmentManager fragmentManager = getSupportFragmentManager();
        if (addBackStack)
            fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).addToBackStack(null).commit();
        else
            fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
    }
}


}
  

И это мой фрагмент (полный код)

 public class DashboardClientFragment extends Fragment implements OnClickListener {

private ViewPager pager;
private TextView add_booking;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_dashboard_client, container, false);

    ((DashboardActivity) getActivity()).setSelectedMenu(1);
    ((DashboardActivity) getActivity()).setBarTitle("Dashboard");

    pager = (ViewPager) v.findViewById(R.id.pager);
    add_booking = (TextView) v.findViewById(R.id.add_booking);

    add_booking.setOnClickListener(this);

    final Map<String, String> params = new HashMap<String, String>();
    params.put("auth", DashboardActivity.user.get(SessionManager.AUTH));

    Log.d("params", params.toString());

    StringRequest dash = new StringRequest(
            Method.POST,
            G.DOMAIN   "index/rest/dashboard",
            new Listener<String>() {

                @Override
                public void onResponse(String json) {

                    Log.d("json", json);

                    DashboardPagerAdapter pagerAdapter = new DashboardPagerAdapter(getActivity().getSupportFragmentManager(), json);
                    pager.setAdapter(pagerAdapter);
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d("error", "Error: "   error.getMessage());
                }
            }) {
        @Override
        protected Map<String, String> getParams() {
            return params;
        }
    };

    AppController.getInstance().addToRequestQueue(dash, null);

    return v;
}

@Override
public void onClick(View v) {
    if (v == add_booking) {
        startActivity(new Intent(getActivity(), BookingActivity.class));
    }
}

}
  

Ответ №1:

Вы должны использовать getChildFragmentManager()

заменить:

 DashboardPagerAdapter pagerAdapter = new DashboardPagerAdapter(getActivity().getSupportFragmentManager(),
json);
pager.setAdapter(pagerAdapter);
  

с:

 DashboardPagerAdapter pagerAdapter = new DashboardPagerAdapter(getChildFragmentManager,
json);
pager.setAdapter(pagerAdapter);
  

Позвольте мне сейчас, если это сработает 😉

Комментарии:

1. Это слово :). Большое вам спасибо.