片段的onCreateView被调用但不是刷新视图,为什么?

时间:2014-07-14 10:36:54

标签: android android-fragments

我想在片段的onCreateView函数上添加一些数据到我的视图。 奇怪的是,如果我每次生成随机ID,logcat很好地显示,它们都是不同的,但在我的EditText只显示每次运行时的第一个。

代码:

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

    String randomId = new Random().nextInt(10000) + "";

    Log.i("onCreateView()", randomId);
    testEdit.setText(randomId);

    return super.onCreateView(inflater, container, savedInstanceState);
}

日志:

07-14 12:30:10.369: I/onCreateView()(4622): 6163
07-14 12:30:36.234: I/onCreateView()(4622): 5706
07-14 12:30:38.516: I/onCreateView()(4622): 2258
07-14 12:30:41.930: I/onCreateView()(4622): 4761

所以当我第一次导航到我的片段时,我的EditText显示为6163。 之后,我导航到另一个片段,然后再次回到有问题的片段。 新的随机ID为5706 ,如logcat的第二行所示,但我的EditText仍然显示为6163.

无论重复多少次,EditText只会显示第一个值而不会刷新。

为什么???

OnCreateView肯定会被调用,我的randomIds肯定会有所不同,我的视图现在仍然令人耳目一新。为什么呢?

我将这个替换函数用于我的片段,可能这是错误的实现:

    public void replace(Fragment fragmentToChange) {

    fragmentTransaction = act.getFragmentManager().beginTransaction();
    fragmentTransaction.replace(container.getId(), fragmentToChange, fragmentToChange.getClass().getSimpleName());
    if (getCurrentFragment() != null && getCurrentFragment() != fragmentToChange) {
        fragmentTransaction.addToBackStack(fragmentToChange.getClass().getSimpleName());
    }
    fragmentTransaction.commit();

}

E D I T:

非常有趣的事实:当我使用TextView的文本执行相同操作时,它可以完成并且有效。看起来像EditText被窃听......?

3 个答案:

答案 0 :(得分:1)

试试这个

View view = inflater.inflate(R.layout.fragment, container, false);
String randomId = new Random().nextInt(10000) + "";

testEdit = view.findViewById(R.id.testEdit);
Log.i("onCreateView()", randomId);
testEdit.setText(randomId);
return view;

答案 1 :(得分:0)

调用onCreateView(...)使片段实例化其用户界面视图。这是可选的,非图形片段可以返回null(这是默认实现)。这将在onCreate(Bundle)和onActivityCreated(Bundle)之间调用。

如果从此处返回视图,稍后将在发布视图时在onDestroyView()中调用。

当片段第一次绘制其用户界面时,系统会调用此方法。

试试这个

              DiplayFragment newFragment = new DiplayFragment();

              FragmentTransaction transaction = getSupportFragmentManager()
                                            .beginTransaction();
              transaction.replace(R.id.nav_fl_frag_container, newFragment);
              transaction.addToBackStack(null);
              transaction.commit();

答案 2 :(得分:0)

像这样更改片段

getFragmentManager().beginTransaction().replace(R.id.container, new Article()).commit();

其中Article是Fragment,而container是FrameLayout的id