0

Я искал везде, но не смог найти ответ, который бы соответствовал моему делу. Вот что: у меня есть фрагмент, который показывает пейджер с двумя другими фрагментами, оба эти фрагмента используют асинтекс для получения информации из базы данных 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"; 
     } 
    } 



} 
+0

Добавьте 'андроида: configChanges =«ориентация | Размер экрана»' с 'FragmentActivity' тега в вашем файле' Manifest.xml' –

+1

вы можете использовать безголовые фрагменты для этого, просто google «безгласный фрагмент, чтобы сохранить экземпляр», и вы найдете примеры для его реализации. –

+0

О, моя доброта, ориентация «android: configChanges =» screenSize »сделала трюк, но почему? «android: configChanges =« orientation | keyboardHidden », и это не сработало, как ожидалось ... В любом случае, большое спасибо :) –

ответ

0

Решение было предложено Anshul Тяги

«Добавить android:configChanges="orientation|screenSize" с FragmentActivity тегом в вашем Manifest.xml»

является только в том случае, если ваш файл макет же для портрета и пейзажа как , означает использование только одного макета. Если это так, то это лучшее решение. Но, если нет, то попробуйте this, которая в принципе Headless Fragment как указано на Satyen

+0

Хорошо, я посмотрю на это, может быть, мне это понадобится, m, касающихся макета для планшетов. Спасибо. –

Смежные вопросы