how*_*ttl 55 android android-lifecycle android-fragments android-viewpager android-nested-fragment
我有一个包含ViewPager的片段.ViewPager与包含一组片段的适配器相关联.
在加载父片段后,我遇到了一条IllegalStateException
消息:java.lang.IllegalStateException: Recursive entry to executePendingTransactions
.
一些研究使我得出结论,系统无法在另一个片段中显示片段,但是似乎有一些迹象表明可以通过使用ViewPager完成此操作(ViewPager中的一个错误与其他片段一起使用)).
实际上,如果我向我的父片段添加一个按钮,mPager.setAdapter(mAdapter)
在按下时调用我的ViewPager,ViewPager会成功加载.这不太理想.
那么问题必须与片段生命周期有关.因此,我的问题是:有没有其他人找到解决这个问题的办法,如果是,怎么办?
有没有办法在片段事务之后延迟ViewPager上的适配器设置?
这是我的父片段代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setAdapter(mAdapter);
button.setVisibility(View.GONE);
}
});
mAdapter = new ViewPagerAdapter(getFragmentManager());
// mViewPager.setAdapter(mAdapter);
return mView;
}
Run Code Online (Sandbox Code Playgroud)
和适配器:
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
Bundle b = createBundle(position, mCursor);
return TeamCardFragment.newInstance(b);
}
}
Run Code Online (Sandbox Code Playgroud)
Yas*_*mar 60
使用AsyncTask为viewPager设置适配器.这个对我有用.asyncTask是使原始片段完成它的转换.然后我们继续使用viewPager片段,基本上是为了避免递归.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setAdapter(mAdapter);
button.setVisibility(View.GONE);
}
});
mAdapter = new ViewPagerAdapter(getFragmentManager());
new setAdapterTask().execute();
return mView;
}
private class setAdapterTask extends AsyncTask<Void,Void,Void>{
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mAdapter);
}
}
Run Code Online (Sandbox Code Playgroud)
Les*_*zek 38
Jords,我想你可以用FragmentStatePagerAdapter
而不是FragmentPageAdapter
.它会为你删除碎片.
PS.很抱歉使用答案而不是评论,但我的声誉太低了.
Ste*_*yle 26
我刚遇到同样的问题.我有Fragment
一个需要举办ViewPager
的Fragments
.当我把另一个堆叠在我的Fragment
上面ViewPagerFragment
然后回击时,我会得到一个IllegalStateException
.检查日志(堆叠新时后Fragment
),我发现我ViewPagerFragment
会去通过其生命周期的方法来阻止和破坏,但其子女Fragments
在该ViewPager
会留在onResume
.我意识到,孩子Fragments
应该由被管理FragmentManager
的ViewPagerFragment
,不是FragmentManager
的Activity
.
我当时理解,上面的答案是为了解决Fragments
不能生孩子的局限Fragments
.但是,现在最新的支持库已经支持Fragment
嵌套,您不再需要为自己设置适配器ViewPager
,并且getChildFragmentManager()
只需要传递即可.到目前为止,这对我来说一直很好.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager) mView.findViewById(R.id.team_card_master_view_pager);
mAdapter = new ViewPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mAdapter);
return mView;
}
Run Code Online (Sandbox Code Playgroud)
ina*_*ruk 19
我曾经Handler.post()
在原始片段事务之外设置适配器:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mHandler.post(new Runnable() {
@Override
public void run() {
mViewPager.setAdapter(mAdapter);
}
});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
37728 次 |
最近记录: |