#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. Это слово :). Большое вам спасибо.