我有一个片段 ;
MyFragment myFrag = new MyFragment();
Run Code Online (Sandbox Code Playgroud)
我把bundle数据放到这个片段:
Bundle bundle = new Bundle();
bundle.putString("TEST", "test");
myFrag.setArguments(bundle);
Run Code Online (Sandbox Code Playgroud)
然后,我用这个替换旧片段并放在backstack上:
//replace old fragment
fragmentTransaction.replace(R.id.fragment_placeholder, myFrag, "MyTag");
//put on backstack
fragmentTransaction.addToBackStack(null);
//commit & get transaction ID
int transId = fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
后来,我使用上面的事务ID()弹出backstacktransId:
//pop the transaction from backstack
fragmentManager.popBackStack(transId,FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
后来,我再次将bundle数据作为参数设置到我的fragment(myFrag):
//Got Java.lang.IllegalStateException: fragment already active
myFrag.setArguments(bundle);
Run Code Online (Sandbox Code Playgroud)
如您所见,我的上述代码异常Java.lang.IllegalStateException: fragment already active.虽然我已经从backstack弹出了它的事务,但我不明白为什么 myFrag 仍然有效.无论如何,因为我得到了例外,我认为我别无选择,只能取消激活片段,所以,我做了:
Fragment activeFragment = fragMgr.findFragmentByTag("MyTag");
fragmentTransaction.remove(activeFragment); …Run Code Online (Sandbox Code Playgroud) android android-emulator android-intent android-layout android-fragments
是否可以在片段之间切换而无需一直重新创建片段?如果是这样,怎么样?
在文档中,我找到了如何替换Fragments的示例.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
但我不希望每次需要时都从头开始创建我的碎片.
// The content view embeds two fragments; now retrieve them and attach
// their "hide" button.
FragmentManager fm = getFragmentManager();
addShowHideListener(R.id.frag1hide, fm.findFragmentById(R.id.fragment1));
addShowHideListener(R.id.frag2hide, fm.findFragmentById(R.id.fragment2));
Run Code Online (Sandbox Code Playgroud)
但是,如何在XML文件外部创建一个带有ID的片段?
我认为这可能与这个问题有关,但没有答案.:/ …
我正在为平板电脑开发Android应用,而不是使用兼容性库.
只有一个Activity,它使用带有3个选项卡的ActionBar.在TabListener中,我使用setContentView加载特定于该选项卡的布局,然后将相关片段添加到其框架中.这几乎与我想要的完全一样,除非你在选项卡之间切换得足够快,应用程序就会崩溃.
我使用三星Galaxy Tab作为我的调试设备,切换标签非常快.以正常速度,我可以在它们之间来回切换,页面立即加载.问题是当我在选项卡之间进行超级切换时.
起初我得到了一个
IllegalStateException: Fragment not added
Run Code Online (Sandbox Code Playgroud)
如下所示:http: //code.google.com/p/android/issues/detail? id = 17029根据onTabUnselected中使用try/catch块的建议,我使应用程序更加强大,但导致手头的问题:
IllegalArgumentException: No view found for id 0x... for fragment ...
Run Code Online (Sandbox Code Playgroud)
我没有在网上找到任何其他有同样问题的案例,所以我担心我可能会做一些不受支持的事情.同样,我想要做的是在一个Activity中使用3种不同的布局 - 当你单击一个选项卡时,监听器将调用setContentView来更改布局,然后添加片段.除非您开始在标签之间积极切换,否则它的工作效果非常好
我从以下方面得到了这个想法:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.html 而不是TabListener保留对一个片段的引用,我有一系列的.此外,我没有使用附加/分离,因为这些只是在API 13中添加.
我的理论是setContentView还没有完成创建视图,这就是FragmentTransaction无法添加它们的原因,或者当选择另一个选项卡并调用setContentView时,为一个选项卡添加片段,从而破坏另一组视图.
我试图破解一些东西来减慢标签切换速度,但没有到达任何地方.
这是我的TabListener的代码:
private class BTabListener<T extends Fragment> implements ActionBar.TabListener{
private int mLayout;
private Fragment[] mFrags;
private TabData mTabData;
private Activity mAct;
private boolean mNoNewFrags;
public BTabListener(Activity act, int layout, TabData td, boolean frags){
mLayout = layout;
mTabData = …Run Code Online (Sandbox Code Playgroud) 当使用add()方法添加新片段时,我遇到了"意外行为".
我想在FrameLayout上添加一个新片段,但是当我这样做时,前面的片段仍然可见.
这是使用add()方法时的预期结果吗?
这是因为我使用FrameLayout和add()方法只是在FrameLayout上放置一个片段而不影响前一个?
谢谢
我将此方法称为从AFrag转到BFrag:
showFragment()
{
FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();
// Add fragment to the container ContentView
fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());
// Add FADE effect
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
// Keep the transaction in the back stack so it will be reversed when backbutton is pressed
fragmentTransaction.addToBackStack(null);
// Commit transaction
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
它显示一个新片段(BFrag),替换前一个片段(AFrag)并保留有关事务的信息,因此可以在按下后退按钮时自动撤消/撤消.
当按下后退按钮时,一切看起来都很好,显示前一个片段(AFrag).但是当我再次前进时(AFrag - > BFrag)我得到了一个"碎片已经添加了例外".
反向/撤消操作没有删除新片段(BFrag)吗?这是预期的行为吗?
这很奇怪,因为在此之后,我决定设置一张支票:
if(mBFrag.isAdded())
{
fragmentTransaction.show(mBFrag);
}
else
{
fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag, mBFrag.getTag());
}
Run Code Online (Sandbox Code Playgroud)
而且,它进入了else语句......我得到了异常.
我对你做错了什么了解吗?
谢谢.
我想从FragmentActivity中更改片段中的ImageView(在代码中创建).(XML中没有片段和标记).
从FragmentActivity扩展的MainActivity和从GooglePlayServicesClient.ConnectionCallbacks实现的:
...
FragmentAdapter mAdapter;
ViewPager mPager;
...
public void onCreate(Bundle savedInstanceState){
...
FragmentManager fm = getSupportFragmentManager();
mAdapter = new FragmentAdapter(fm);
mPager.setAdapter(mAdapter);
...}
@Override
public void onConnected(Bundle connectionHint){
//*** I want to change a ImageView on Fragment1 here
}
Run Code Online (Sandbox Code Playgroud)
从FragmentPagerAdapter扩展的FragmentAdapter:
...
private FragmentManager mFragmentManager;
public FragmentAdapter(FragmentManager fm){
super(fm);
}
@Override
public Fragment getItem(int pos){
// String name = makeFragmentName(R.id.mainPager, pos);
// Fragment fragmentObject = mFragmentManager.findFragmentByTag(name);
Fragment fragmentObject = null;
switch(pos){
case 0:
fragmentObject = new Fragment1();
break;
...
}
return …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentpageradapter android-fragmentactivity