【发布时间】: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