相关疑难解决方法(0)

得到例外:片段已经激活

我有一个片段 ;

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

58
推荐指数
2
解决办法
4万
查看次数

Android Honeycomb:如何更改FrameLayout中的碎片,而无需重新创建它们?

是否可以在片段之间切换而无需一直重新创建片段?如果是这样,怎么样?

在文档中,我找到了如何替换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 android-fragments android-3.0-honeycomb

14
推荐指数
1
解决办法
2万
查看次数

IllegalArgumentException:快速切换ActionBar Tabs时,没有为片段的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)

android android-fragments android-3.0-honeycomb

9
推荐指数
1
解决办法
1万
查看次数

使用add()方法添加片段不会隐藏先前的片段

当使用add()方法添加新片段时,我遇到了"意外行为".

我想在FrameLayout上添加一个新片段,但是当我这样做时,前面的片段仍然可见.

  • 这是使用add()方法时的预期结果吗?

  • 这是因为我使用FrameLayout和add()方法只是在FrameLayout上放置一个片段而不影响前一个?

谢谢

android fragment android-fragments android-3.0-honeycomb

5
推荐指数
2
解决办法
1万
查看次数

片段行为:FragmentTransaction :: replace()和反向backStack操作

我将此方法称为从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语句......我得到了异常.

我对你做错了什么了解吗?

谢谢.

android fragment android-fragments android-3.0-honeycomb

5
推荐指数
1
解决办法
1万
查看次数

从fragmentActivity刷新片段UI

我想从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

2
推荐指数
1
解决办法
1万
查看次数