我有一个片段界面,底部有标签,可以在主视图中打开不同的片段.
我有一个特定的片段,它是一个项目列表.如果用户选择此列表中的一个项目,则打开另一个片段,其中包含一个viewpager,它在前一个片段的列表中的所有项目之间水平滚动.这非常有效.
viewpager使用FragmentPagerAdapter来显示项目.
当用户选择列表中的项目,查看它,然后点击标签栏上的按钮返回列表,然后选择另一个项目时,问题就出现了.第二次选择项目时,将显示空白屏幕而不是viewpager.发生这种情况时,我的LogCat中没有收到任何错误.
为什么viewpager只出现在第一次?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
Run Code Online (Sandbox Code Playgroud)
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-nested-fragment
我在ViewPager中有一个ViewPager,我得到了这个例外
09-07 18:30:26.392: ERROR/AndroidRuntime(841): FATAL EXCEPTION: main
java.lang.IllegalStateException: Recursive entry to executePendingTransactions
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1331)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86)
at android.support.v4.view.ViewPager.populate(ViewPager.java:453)
at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563)
at android.view.View.dispatchAttachedToWindow(View.java:7974)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewGroup.addViewInner(ViewGroup.java:2968)
at android.view.ViewGroup.addView(ViewGroup.java:2824)
at android.support.v4.view.ViewPager.addView(ViewPager.java:537)
at android.view.ViewGroup.addView(ViewGroup.java:2781)
at android.view.ViewGroup.addView(ViewGroup.java:2761)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:848)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:616)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1359)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:422)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:86)
at android.support.v4.view.ViewPager.populate(ViewPager.java:453)
at android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.java:563)
at android.view.View.dispatchAttachedToWindow(View.java:7974)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1857)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1862)
at android.view.ViewRoot.performTraversals(ViewRoot.java:726)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1944)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:126)
at android.app.ActivityThread.main(ActivityThread.java:3997)
at java.lang.reflect.Method.invokeNative(Native …Run Code Online (Sandbox Code Playgroud) 有信息,这是不可能使用ViewPager内Fragment像"许多来源的忙打码机指南Android开发 "由马克·墨菲,或职位像这样的SO.我很困惑,因为我没有这样的问题而且我成功地使用了ViewPager我的内容Fragment.唯一的区别是我实例化了一个ViewPagernot in onCreateView()方法而不是in onActivityCreated().一切都很好.
所以问题是 - 可能是我只是不知道某些事情,并且出于某些原因不推荐这样做以进行UI实例化onActivityCreated()?但又一次 - 一切正常.
这是类和xml的列表:
public class ViewPagerFragment extends Fragment {
static final int NUM_ITEMS = 2;
private ViewPagerAdapter mAdapter;
private ViewPager mPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.view_pager_fragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new ViewPagerAdapter(getFragmentManager());
mPager = (ViewPager) getView().findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
public …Run Code Online (Sandbox Code Playgroud) 我还没有找到一种方法如何动态地将片段添加到现有的动态添加片段中.你知道吗,如果可能的话?
我这样生成片段:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();
if(null == fragMgr.findFragmentByTag(FRAG1_TAG)) {
xact.add(10101010, new DateTime(), FRAG1_TAG);
}
if(null == fragMgr.findFragmentByTag(FRAG4_TAG)) {
xact.add(7777, new loginForm(), FRAG4_TAG);
}
xact.commit();
Run Code Online (Sandbox Code Playgroud)
如何添加到另一个FRAG4_TAG片段?
EDIT2:
我硬编码它的ID是为了能够在将来使用它(其中ll是我在XML中的linearLayout):
FrameLayout frml4 = (FrameLayout)inflater.inflate(R.layout.frame,null);
frml4.setId(7777);
frml4.setBackgroundColor(Color.YELLOW);
ll.addView(frml4);
Run Code Online (Sandbox Code Playgroud) 我在实现基于多个ViewPagers的设计时遇到了一些麻烦.
在高级别,我有一个FragmentActivity只有一个FrameLayout作为它的内容.我想要显示3个不同的碎片.全部3个全屏,一次只使用1个.
片段1是一个带有一些TextView和ImageViews的基本片段.片段2有一个ViewPager和一个FragmentPagerAdapter,可以为它提供几个简单的片段.片段3有一个ViewPager和一个FragmentPagerAdapter,可以为它提供几个简单的片段(与片段2不同)
在我的FragmentActivity onCreate()中,我获得了FragmentManager并开始一个事务,用一个新的Fragment 2实例替换我的FrameLayout中的任何东西.
在这一点上,一切都按预期工作.Fragment 2中的我的ViewPager工作得很好.
现在我有一个菜单选项,用我的FrameLayout中的Fragment 2替换Fragment 3的新实例.这也可以正常工作.
当我尝试使用另一个替换事务将Fragment 2放回FrameLayout时出现问题.我看到我的PagerIndicater位于顶部,但我的页面是空白的.
我试过创建一个我的Fragment 2的新实例并调用一个替换事务.当我调用replace并在替换之前添加findFragmentByTag检查而不是创建新实例时,我也尝试在我的Fragments上设置标记.在第二次更换后,两者都给了我相同的空白页结果.
供参考我的第一个设计只是一个带有ViewPager和ViewIndicater的FragmentActivity.我上面的描述中只有Fragment 2和Fragment 3以及在它们之间切换的菜单选项.要切换我有2个不同的FragmentPagerAdapters定义,只需调用ViewPager.setAdapter来设置选定的FragmentPagerAdapter.这是完美的,但现在我需要一个新的顶级片段,根本不使用ViewPager.这就是我决定将ViewPagers移到他们自己的片段中的原因.我的想法是,我只是将我的片段交换到FrameLayout.
我现在没有我的代码在我面前所以我不能发布任何代码,但我明天会在我的问题中添加一些代码来帮助提供答案.
android android-fragments android-viewpager fragmentpageradapter android-nested-fragment
我写的应用程序有3个片段.当我按下搜索按钮时,主片段活动有一个带搜索按钮的搜索框,调用下面的函数:
Fragments.values()[tabControl.getCurrentItem()].getFragment().search(tv.getText().toString(), MainActivity.this.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我按下HOME按钮等待30分钟并重新启动应用程序,在我按下FragmentYellowPagesFragment应用程序中的搜索按钮后崩溃
lvYellowPages.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
因为lvYellowPages在这种情况下是null,但在日志中我可以看到该onCreateView函数被调用.能帮帮我吗,我可以和你分享我的代码.
public class FragmentAdapter extends FragmentPagerAdapter {
Fragments[] mFragments;
public FragmentAdapter(FragmentManager fm) {
super(fm);
mFragments = Fragments.values();
}
public enum Fragments {
Favorites(App.getStringByResId(R.string.favorites), new FragmentFavorites()),
Categories(App.getStringByResId(R.string.categories), new FragmentCategories()),
YellowPages(App.getStringByResId(R.string.yellow_pages), new FragmentYellowPages());
Fragments(String title, BaseListFragment fragment) {
this.mTitle = title;
this.mFragment = fragment;
}
String mTitle;
BaseListFragment mFragment;
public String getTitle() {
return mTitle;
}
public BaseListFragment getFragment() {
return mFragment;
}
};
@Override
public CharSequence getPageTitle(int position) …Run Code Online (Sandbox Code Playgroud) 我有具有两个片段的视图寻呼机的片段AroundMeFragment MapFragment和ListFragment.当我第一次在这个片段中输入时,一切正常,但当我点击一个项目进入一个新片段中的详细视图,然后返回到AroundMeFragment时,视图为空,没有绘制任何项目.并且,如果我退出此片段并再次输入片段为空白.
当我从细节片段返回到AroundMeFragment时,如何才能看到片段的内容?
ArouundMeFragment:
public ArroundMeFragment() {
}
public static Fragment newInstance(Bundle bundle) {
ArroundMeFragment f = new ArroundMeFragment();
f.setArguments(bundle);
return f;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity = activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sectionShowed = MAP_VIEW_ARROUND_ME;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.arround_me_main_layout, container, false);
mViewPager = (ViewPager) v.findViewById(R.id.viewPager);
if (fragments == null) {
fragments = new ArrayList<Fragment>();
fragments.add(MapMainFragment.newInstance());
Bundle bundle …Run Code Online (Sandbox Code Playgroud) 我正在使用带有v4软件包的Google API 8(Android 2.2).
嗨,这是我的问题:
我有一个FragmentActivity,它有一个总是停留在屏幕上的菜单和一个小容器(一个FrameLayout),我放了许多片段.当我隐藏并显示片段时,我的应用程序工作正常,但是在我加载所有片段后崩溃,因为我使用的内存有限.在这种情况下,我必须在加载其他片段时删除一些片段,因此应用程序不会崩溃.但是这里出现了另一个问题,我删除后我的寻呼机没有重新加载,所有其他片段工作正常.只有我的寻呼机没有显示,它们不会崩溃,只是消失.这里有一些代码可以帮助您了解我的问题:
MyFragmentActivity.java具有以下布局:
<LinearLayout
...(some code from menu that doesn't matter)
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
在那个FrameLayout中,我把所有碎片都放了.寻呼机片段是其中之一,其布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+android:id/some_pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我实现了这个抽象类AbstractPagerFragment:
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class AbstractPagerFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View fragment …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmenttransaction
首先,我知道这些主题已经在stackoverflow上创建了很多时间,但我没有找到解决问题的方法.其次,我是法国人,所以我的英语不完美,对不起,请告诉我,如果你不明白的话.为了完成这个介绍,这是我第一次处理片段,所以,对不起,如果有一些我不太了解的东西!
我有三个按钮,允许在三个片段之间切换.在其中一个片段中,我有一个带有两个片段的视图寻呼机.目前,每个片段(有5个),只包含一个TextView.我正在使用最新版本的android-support-v4(我已经在stackoverflow中阅读了很多主题,说最新版本的支持解决了我的"递归进入executePendingTransactions"错误).
我的两个问题:
当我在一个按钮中单击两次时,我有一个IllegaleStateException"无法更改片段的标记".我能够通过在onButtonSelected方法上创建一个新片段来解决这个问题,但是我不希望每次都重新创建片段,出于内存原因和功能原因:片段必须保持她的状态.这个问题不是我的主要问题,事实上,我知道当用户已经处于片段状态时禁用按钮是可能的,但是当没有完成此管理时会出现异常,这是奇怪的吗?
当我从视图寻呼机的片段出来,然后我回到这个片段时,我有一个IllegalStateException"递归进入executePendingTransactions".我可以通过在处理程序上设置我的适配器来解决这个问题,或者使用FragmentStatePagerAdapter而不是FragmentPageAdapter(请参阅片段中的显示片段viewpager),但即使我的应用程序没有崩溃,当我使用视图寻呼机返回我的片段时,视图寻呼机已消失!
你能帮助我吗 ?
Java源代码如下,我认为布局源代码是无用的.
主要活动 :
public class MainActivity extends SherlockFragmentActivity{
private SherlockFragment fragmentOne, fragmentTwo, fragmentThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this.fragmentOne = new fragmentOne();
// this.fragmentTwo = new fragmentTwo();
// this.fragmentThree = new fragmentThree();
// Call new or instanciate ? What's the correct way ?
this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName());
this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName());
this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName());
// Add fragment
FragmentTransaction transaction = (
this.getSupportFragmentManager().beginTransaction()
); …Run Code Online (Sandbox Code Playgroud)