【问题标题】:AsyncTask orientation problems with view pager and nested fragementsviewpager 和嵌套片段的 AsyncTask 方向问题
【发布时间】:2015-05-20 11:47:24
【问题描述】:

我到处搜索,但找不到适合我情况的答案。 事情是这样的:我有一个片段,它显示了一个带有其他两个片段的视图寻呼机,这两个片段都使用 asynctask 从 Parse.com 数据库中获取信息。我使用 asynctask 的原因只是在应用程序从解析中获取数据时显示进度条。我的问题是:每当我在“后台执行”方法时将方向更改为横向(反之亦然),应用程序就会崩溃。我想做的是保持异步任务进程运行而不管方向变化,这可能吗?

P.S:我尝试将“setRetainInstance(true)”放在 parentFragment 上,但没有成功。当我将“setRetainInstance(true)”放在视图寻呼机内的片段上时,我会强制关闭。

这是我在视图寻呼机 (NewsFragment) 上的片段 1:

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";
        }
    }



}

【问题讨论】:

  • Manifest.xml 中添加带有FragmentActivity 标签的`android:configChanges="orientation|screenSize"`
  • 您可以为此使用无头片段,只需谷歌“无头片段保留实例”,您会找到实现它的示例
  • 哦,天哪,“android:configChanges="orientation|screenSize" 成功了,但是怎么来的?我试过 "android:configChanges="orientation|keyboardHidden" 但没有按预期工作......无论如何,非常感谢你:)

标签: android android-fragments android-asynctask android-viewpager android-nested-fragment


【解决方案1】:

Anshul Tyagi 提出的解决方案

“在 Manifest.xml 中添加带有 FragmentActivity 标记的 android:configChanges="orientation|screenSize"

仅当您的布局文件对于纵向和横向都相同时才适用,这意味着仅使用单一布局。如果是这种情况,那么这是最好的解决方案。但是,如果没有,请尝试this,这基本上是 Satyen

所指出的Headless Fragment

【讨论】:

  • 好的,我来看看,也许我在处理平板电脑的布局时需要它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多