奇怪的片段生命周期错误

时间:2011-05-03 02:35:01

标签: android android-fragments

修改

所以我的Fragment似乎保留在尝试重新初始化的FragmentManager中。仍然不确定为什么它没有被Activity破坏。至于加载消息,当ListView没有设置适配器时会显示。但是,我在onCreateonResume中设置了适配器项目,因此我不确定为什么会显示此加载屏幕。仍然对这种行为的任何解释持开放态度

原始

我正在玩碎片,并注意到当我改变屏幕方向时会弹出一个奇怪的错误。但是不应该发生此错误,因为在更改屏幕方向时,会在onCreate中重新创建所有数据。此外,片段onResume()在旋转后被调用两次。这是我创建错误的步骤以及调试器如何使用函数。

  • 活动:onCreate()
  • 活动:onResume()
  • 片段:onResume()
  • 旋转屏幕
  • 活动:onCreate()
  • 活动:onResume()
  • 片段:onResume()(即使Activity.onResume()设置它们,项也为空)
  • 片段:onResume()(项目不为空,为什么要调用两次?)

点击最后​​一个片段onResume后,平板电脑会显示“正在加载...”消息和图标。为什么数据不再显示在列表中?我怀疑onCreate正在创建第二个片段。第一个片段由于取向破坏视图而丢失其数据,第二个片段获取数据,加载屏幕是第一个没有数据项的片段,第二个片段被隐藏。我可能错了。当屏幕像Activity一样旋转时,为什么片段都不会被破坏?请不要批评代码,除非它解决这个具体问题。我实际上并没有制作应用程序,我正在尝试使用片段功能。谢谢!

主要活动

private ArrayList<Object> items = new ArrayList<Object>();
private MyListFragment mylistFragment;

public MainActivity() {
    items.add("Hello");
    items.add("World");
    items.add("Goodbye");
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();

    mylistFragment = new MyListFragment();
    mylistFragment.setItems(items);

    ft.add(R.id.container, mylistFragment);
    ft.commit();
}

@Override
public void onResume() {
    super.onResume();

    mylistFragment.setItems(items);
    mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show();
        }

    });
}

列出片段

private List<Object> items = null;
private Boolean isSet = false;

@Override
public void onResume() {
    super.onResume();
    if( !isSet && items != null) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    }
}

public void setItems(List<Object> items) {
    this.items = items;
    if( this.isResumed() ) {
        setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items));
        isSet = true;
    } else {
        isSet = false;
    }
}

3 个答案:

答案 0 :(得分:5)

FragmentManager会自动为我重新创建Fragment。但是,它们内部的数据需要重新初始化。因此我的代码创建了第二个片段。加载屏幕是因为第一个片段不再具有其项目适配器而第二个片段被隐藏。令人头疼的是,我几乎认为FragmentManager应该销毁Fragments,以便您可以使用他们持有的数据重新创建它们。

答案 1 :(得分:0)

我相信这就是为什么在各种演示中通过Diane和其他谷歌示例......他们通常有一些方法可以通过静态方法帮助初始化...和setArguments。

IIRC,片段创建的东西将调用默认构造函数来创建,但只知道通过setArguments填充适当的数据。在android开发博客的例子中...... id正从listactivity传递到细节片段。调用setParams后,fragmentManager应该能够重新生成它。

关于这个主题的文档似乎很少,我想做正确的事情,所以如果你们有反馈,我会很感激。

答案 2 :(得分:0)

似乎使用支持库中的FragmentActivity会自动保存和恢复实例。因此,如果savedInstanceStatenull,则仅执行您的片段交易。

例如,在FragmentActivity的{​​{1}}中,执行以下操作:

onCreate()
相关问题