findFragmentById和findFragmentByTag都返回null

时间:2018-02-05 19:04:12

标签: android android-fragments

我正在尝试使用包含小部件的片段实现卡片翻转动画,因此我需要访问片段,但我没有成功。

我可以将片段附加到活动中的占位符视图中,并在两个片段之间来回切换,但无法访问片段。

我尝试添加带有和没有标记的片段,无论如何,我总是从findFragmentById或findFragmentByTag获得null响应。

以下是我的代码段 - 提前感谢任何见解。

private int row;
private int col;    
private String matrix[][] = new String[row][col];

//constructor for calss matricDec
public void matrixIni(int row, int col){
    this.row = row;
    this.col = col;

    //matrix[1][1] = "test";
    //System.out.println(matrix[1][1]);
}

1 个答案:

答案 0 :(得分:1)

问题是您在提交findFragmentByTag()后立即致电findFragmentById()和/或FragmentTransaction

片段事务本质上是异步的。你已经告诉系统你想要它添加你的片段,它会...但它不一定会瞬间完成(虽然有时它可能)。

您可以通过将.commit()替换为.commitNow().commitNowAllowingStateLoss()来使事务同步,但通常我不建议这样做。我认为你最好只接受事务是异步的事实。

将取决于findFragmentByTag()findFragmentById()的结果的任何代码移出onCreate()并移至onResumeFragments()(或移入碎片本身)。

@Override
protected void onResumeFragments() {
    super.onResumeFragments();

    controlFragment = (ControlFragment)getFragmentManager().findFragmentByTag("fragment_tag");
    controlFragment = (ControlFragment)getFragmentManager().findFragmentById(R.id.card_placeholder_view);
}

修改

我刚刚意识到你正在扩展Activity而不是AppCompatActivity,所以onResumeFragments()不存在。相反,您可以使用onAttachFragment()

@Override
public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);

    if (fragment instanceof ControlFragment) {
        controlFragment = (ControlFragment)fragment;
    }
}