Я искал везде, но не смог найти ответ, который бы соответствовал моему делу. Вот что: у меня есть фрагмент, который показывает пейджер с двумя другими фрагментами, оба эти фрагмента используют асинтекс для получения информации из базы данных Parse.com. Причина, по которой я использую asynctask, - это показать только индикатор выполнения, в то время как приложение получает данные от разбора. Моя проблема: всякий раз, когда я меняю ориентацию на пейзаж (или наоборот), когда метод «Делать в фоновом режиме», приложение вылетает. Я бы хотел сделать так, чтобы процесс asynctask работал независимо от изменений ориентации, возможно ли это?Проблемы с ориентацией AsyncTask с представлением пейджера и вложенными фрагментами
P.S: Я попытался поставить «setRetainInstance (true)» на родительский фрагмент, но это не помогло. И когда я накладываю «setRetainInstance (true)» на фреймы внутри пейджера просмотра, я набираю силу.
Вот мой фрагмент 1 на вид пейджера (NewsFragment):
public class NewsFragment extends Fragment {
(...)
public NewsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View fragmentView = inflater.inflate(R.layout.fragment_news, container, false);
mListView = (ListView) fragmentView.findViewById(R.id.MyListView);
mListView.addFooterView(new View(getActivity()), null, false);
mListView.addHeaderView(new View(getActivity()), null, false);
new RemoteDataTask().execute();
(...)
return fragmentView;
}
// RemoteDataTask AsyncTask
private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// Create the array
mProductsList = new ArrayList<Product>();
try{
ParseQuery<ParseObject> query = ParseQuery.getQuery("Products");
query.orderByDescending("createdAt");
query.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE);
ob = query.find();
for (ParseObject parseObject : ob) {
// Locate images in flag column
String title = (String) parseObject.get("title");
String descrip = (String) parseObject.get("descrip");
preco = (String) parseObject.get("preco");
String data = (String) parseObject.get("data");
String detail = (String) parseObject.get("detail");
user = (String) parseObject.get("user");
imagefile = parseObject.getParseFile("foto");
if (imagefile!=null){
imageUrl = parseObject.getParseFile("foto").getUrl();
}
productId = parseObject.getObjectId();
product = new Product(title, descrip, preco, data, detail, user, imagefile, imageUrl, productId);
mProductsList.add(product);
}
} catch (ParseException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Locate the listview in listview_main.xml
mListView.setAdapter(new MyAdapter());
loadpd = (ProgressBar) getView().findViewById(R.id.loadpd);
getView();
loadpd.setVisibility(View.INVISIBLE);
}
}(...)}
Вот мой фрагмент 2 на вид пейджера (UserProductsFragment)
public class UserProductsFragment extends Fragment {
(...)
public UserProductsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
// Inflate the layout for this fragment
View fragmentView = inflater.inflate(R.layout.fragment_news_user, container, false);
mListView = (ListView) fragmentView.findViewById(R.id.MyUserListView);
mListView.addFooterView(new View(getActivity()), null, false);
mListView.addHeaderView(new View(getActivity()), null, false);
new RemoteDataTask().execute();
return fragmentView;
}
private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// Create the array
if (currentUser != null) {
userid= currentUser.getObjectId();
mProductsList = new ArrayList<Product>();
try{
ParseQuery<ParseObject> query = ParseQuery.getQuery("Products");
query.orderByDescending("createdAt");
query.whereEqualTo("user", userid);
query.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE);
ob = query.find();
for (ParseObject parseObject : ob) { // Locate images in flag column
String title = (String) parseObject.get("title");
String descrip = (String) parseObject.get("descrip");
preco = (String) parseObject.get("preco");
String data = (String) parseObject.get("data");
String detail = (String) parseObject.get("detail");
user = (String) parseObject.get("user");
imagefile = parseObject.getParseFile("foto");
if (imagefile!=null){
imageUrl = parseObject.getParseFile("foto").getUrl();
}
productId = parseObject.getObjectId();
product = new Product(title, descrip, preco, data, detail, user, imagefile, imageUrl, productId);
mProductsList.add(product);
}
} catch (ParseException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Locate the listview in listview_main.xml
mListView.setAdapter(new MyAdapter());
loadpd = (ProgressBar) getView().findViewById(R.id.loadpduser);
getView();
loadpd.setVisibility(View.INVISIBLE);
}
}
Вот фрагмент, который имеет те фрагменты в представлении пейджера
public class MainActivity extends Fragment {
ViewPager viewPager;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, null);
viewPager = (ViewPager) view.findViewById(R.id.pager);
viewPager.setAdapter(new MyPageAdapter(getChildFragmentManager()));
((MaterialNavigationDrawer)this.getActivity()).getToolbar().setLogo(R.drawable.bhlogo);
((MaterialNavigationDrawer)this.getActivity()).getToolbar().setTitle("");
((MaterialNavigationDrawer) this.getActivity()).setSupportActionBar(((MaterialNavigationDrawer) this.getActivity()).getToolbar());
((MaterialNavigationDrawer) this.getActivity()).getSupportActionBar();
setHasOptionsMenu(true);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh:
Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);
return false;
}
return false;
}
public class MyPageAdapter extends FragmentPagerAdapter{
public MyPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new NewsFragment();
}
else {
return new UserProductsFragment();
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
if (position == 0) {
return "Todos os anúncios";
}
else {
return "Meus anúncios";
}
}
}
Добавьте 'андроида: configChanges =«ориентация | Размер экрана»' с 'FragmentActivity' тега в вашем файле' Manifest.xml' –
вы можете использовать безголовые фрагменты для этого, просто google «безгласный фрагмент, чтобы сохранить экземпляр», и вы найдете примеры для его реализации. –
О, моя доброта, ориентация «android: configChanges =» screenSize »сделала трюк, но почему? «android: configChanges =« orientation | keyboardHidden », и это не сработало, как ожидалось ... В любом случае, большое спасибо :) –