![](/img/trans.png)
[英]Error Fragment not attached to an activity when I leave a fragment and enter it again
[英]Why am I getting Fragment not Attached to Activity Error?
我有一个线程会在我的Activity中触发一个带片段的回调方法。 然后,Activity调用Fragment中的方法来刷新具有新信息的UI。 在该方法中,将调用getString()。 调用getstring()时,出现“片段未附加到活动错误”的信息。 此UI刷新错误由runOnUIThread保护。 片段添加如下:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(fragmentContainerID, fragment, tag)
.commit();
fm.executePendingTransactions();
该活动将两个不同的布局文件用于水平和垂直方向。 它们是两种布局中的两个片段容器。 它们在水平和垂直布局中的名称相同,但彼此不匹配。 第一次创建Activity时,使用上述代码添加了片段。 更改方向时,片段会自动添加到布局中,因为片段容器在垂直和水平方向上都具有相同的ID。 当saveInstanceState不为null时,我通过使用以下方式获取对片段的引用
fm.findFragmentByTag
谁能告诉我我做错了吗? 可以将片段明显地很好地添加到Activity中,并且在此线程回调发生之前经过了几分钟,所以我看不到片段没有被“附加”。
编辑:叹息,经过一些调试,我发现以这种方式添加片段非常好。 活动中其他地方的代码(我注册了两次回调)导致片段未附加错误。 如果有人读到此错误,请记住该问题可能是从其他地方触发的。 同样,您必须在片段中将ResetInstance设置为true以避免重新创建它。 仅凭标签就不能做到这一点。
片段因此,如果使用的是添加了一个每容器.add(fragmentContainerID, fragment, tag)
确保首先该fragmentContainerID
对于每个加入的片段的不同。
但是,这类问题通常是由于对方向变化的处理方式存在误解造成的。 当您更改方向并让oncreate处理添加时: 您会得到一个相同类型的新片段,这意味着,如果后台任务引用了您的片段-它引用了旧的 (现在是分离的)片段。 您需要做的是确保将相同的片段添加到标记中(而不是新实例)。 为此,仅在恢复状态时不要(重新)创建片段实例
public class MyActivity ... {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
MyFragment frag = new MyFragment();
frag.setArguments( getIntent().getExtras() ); //if it takes params
fm.beginTransaction().add(fragmentContainerID, frag, tag).commit();
}
//after this point a call to MyFragment frag = (MyFragment) fm.findFragmentByTag(tag); should always return the correct fragment
}
对于您的任务来说,在执行回调以更新UI(而不是保留对它的引用)时查找片段是正确的选择,这也是一个明智的想法。 取决于您如何设置任务,这仅意味着从FragmentManager fm = getSupportFragmentManager();
更改为FragmentManager fm = getSupportFragmentManager();
然后创建任务,将其作为onPostExecute
一部分进行调用
更改方向时,片段会自动添加到FragmentManager并忘记自己的标签!
使用以下代码查找您的片段:
FragmentManager fragmentManager= getSupportFragmentManager();
for (Fragment fragment : fragmentManager.getFragments())
{
if(fragment instanceof MyFragment)
myFragment = (MyFragment)fragment;
}
找到方向改变的片段后,请尝试分离它们,然后在执行任何操作之前将其重新连接。 或者,如果这样不起作用,请将其删除并添加。 然后继续.....我什至不得不在分离后和连接之前有时要花几毫秒的时间,以确保一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.