繁体   English   中英

为什么我的片段未附加到活动错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM