在方向更改后,不会显示以编程方式将Fragment添加到FrameLayout

时间:2015-09-30 11:26:00

标签: android android-fragments

  1. 我有一个Activity,其中包含一个Fragment
  2. 在此片段中(RelativeLayout设置为内容视图)我以编程方式添加了许多FrameLayouts
  3. 在添加期间,我使用View.generateId()为这些framelayouts设置了ID。
  4. 然后我以编程方式将嵌套片段添加到FrameLayouts(让我们称之为 Slots )。
  5. 最后我再次添加嵌套片段,但这次是 slots 。在广告位中,我可以添加MyImageFragmentMyVideoFragmentMyWebViewFragment
  6. 使用ScheduledThreadPoolExecutor我更改广告位的内容
  7. 我遇到的问题是,当我旋转设备时,我看不到我添加的碎片。

    我使用findFragmentByTag()重用我的片段。

    旋转前的层次结构:

    before rotation

    并在轮换后:

    after rotation

    如何解决这个问题?为什么片段没有附加?

1 个答案:

答案 0 :(得分:0)

答案是在最低级别( slot 级别),我没有保存View.generateId()生成的值。所以我需要添加这部分代码。

public static String LAYOUT_ID = "LAYOUT_ID";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        frameLayoutId = savedInstanceState.getInt(LAYOUT_ID);
    } else {
        frameLayoutId = -1;
    }
 }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_slot, container, false);

    if (frameLayoutId == -1)
        frameLayoutId = View.generateViewId() ;

    view.setId(frameLayoutId);
    }

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt(LAYOUT_ID, frameLayoutId);
    super.onSaveInstanceState(outState);
}