重新添加相同的片段后,片段中的元素无法正常工作

The*_*ter 11 android listview android-appcompat android-fragments

更新:我发现标头不是唯一受影响的东西,但listeners片段中的其他元素没有被初始化.(比如FAB).唯一正常运行的东西是内置的任何东西adapter(即ListView行)

问题:打开导航抽屉,单击列表项打开一个新Fragment的同一个Activity.再次打开导航抽屉,单击应该简单替换现有的相同项目,FragmentFragment打开时,所有以Java编程设置的元素(文本,颜色,侦听器)都不会更改/添加到Fragment.视图只是默认xml布局.我已经证实了Log.d这,设置这些东西的代码正在运行的时间.(如果你打开一个不同的Fragment,然后回到原来的,一切正常)

确认原因: 更改此内容时:

    compile "com.android.support:appcompat-v7:25.0.1"
    compile 'com.android.support:design:25.0.1'
Run Code Online (Sandbox Code Playgroud)

    compile "com.android.support:appcompat-v7:25.1.0"
    compile 'com.android.support:design:25.1.0'
Run Code Online (Sandbox Code Playgroud)

(如果只更改了其中一个库,那么哪个库仍然无关紧要)

我已经确认更改这两个库是问题(在第二个应用程序中也确认了这个问题 - 并且更改此代码,具有完全相同的结果)

我的问题是,为什么会发生这种情况以及如何解决?

原始问题的代码和更详细的描述:

                FragmentTransaction tItems = fm.beginTransaction();
                ListFragment mFrag = new PlannerFragment();
                tItems.replace(R.id.main_frag, mFrag, TAG_CALC_FRAGMENT);
                tItems.commit();
Run Code Online (Sandbox Code Playgroud)

我的抽屉里有大约4个选项都可以打开这个片段,但在每个选项之前,我设置了一个像这样的全局变量:

MyApp.PlanType = "highbal";
MyApp.PlanType = "lowbal";
etc.
Run Code Online (Sandbox Code Playgroud)

基于PlanType值(上面),Fragment加载了不同的数据(但是,在完全相同的xml布局中).它只是ListView一个标题.

这个Fragment,(PlannerFragment)第一次加载正常.

当我点击另一个相同的项目(不同的PlanType)时Fragment(上面执行的代码相同):ListView实际列表中的加载正常. 但是header列表中,没有一个setText()值正确设置新数据.它使用我的xml布局中的默认值.

现在,如果我加载不同的Fragment东西,一切都很好.只有当我添加或替换(我已经尝试过两者)时,Fragment才会发生这种情况.

这是顶部的标题代码 PlannerFragment

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Setup listview
        lv = getListView();

        LayoutInflater inflaterHeader = getActivity().getLayoutInflater();
        ViewGroup header = (ViewGroup) inflaterHeader.inflate(R.layout.planner_listview_header, lv, false);
        lv.addHeaderView(header, null, false);

        // Load Data then Set Textviews, e.g.:
        TextView title = (TextView) getActivity().findViewById(R.id.tvPlannerTitle);
    dateOutput = (TextView) getActivity().findViewById(R.id.tvDebtOutDate);
Run Code Online (Sandbox Code Playgroud)

如果我添加到该代码,dateOutput.setText("test");它不会发生.我可以执行一个Log.d和我的数据寄存器,因此正在读取此代码,但未设置UI.

我甚至尝试Fragment用支票删除第一个这样的:

                Fragment fragment = fm.findFragmentByTag(TAG_CALC_FRAGMENT);
                if(fragment != null)
                    fm.beginTransaction().remove(fragment).commit();
Run Code Online (Sandbox Code Playgroud)

这没有效果.

同样,这只发生在我更改上面的库时.这是库中的错误还是现在响应不同?

Hug*_*sse 12

appcompat 25.1.0上的片段有许多变化和问题.第一个似乎与您的问题有关,但下一个应该被阅读,因为它可能很重要.


FragmentTransaction替换行为

替换在appCompat 25.1.0中无法正常工作
当前状态(2017年1月4日):错误已分配
问题链接


片段生命周期在25.1.0上更改

onStart on new Fragment在onStop之前调用前一个
当前状态:按预期工作.对我来说,它可能是app compat 25.0.x Issue链接的重大变化

在片段中调用两次resume事件也存在问题,请参见此处.

TLDR.也许最好的临时解决方案是在新版本发布之前不使用25.1.0.