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

时间:2016-12-30 22:41:16

标签: android listview android-fragments android-appcompat

更新:我发现标题不是唯一受影响的内容,但片段中的listeners和其他元素未被初始化。 (比如FAB' s)。唯一正常运行的是adapter内部构建的任何东西(即ListView行)

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

确认原因:更改时:

    compile "com.android.support:appcompat-v7:25.0.1"
    compile 'com.android.support:design:25.0.1'

    compile "com.android.support:appcompat-v7:25.1.0"
    compile 'com.android.support:design:25.1.0'

(如果这些库中只有一个被更改了,那么问题并不重要,问题仍然存在)

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

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

代码和原始问题的更详细说明:

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

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

MyApp.PlanType = "highbal";
MyApp.PlanType = "lowbal";
etc.

基于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);

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

我甚至尝试使用支票首先删除Fragment

                Fragment fragment = fm.findFragmentByTag(TAG_CALC_FRAGMENT);
                if(fragment != null)
                    fm.beginTransaction().remove(fragment).commit();

这没有效果。

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

2 个答案:

答案 0 :(得分:12)

appcompat 25.1.0上有很多更改和碎片问题。第一个似乎与您的问题有关,但下一个应该被阅读,因为它可能很重要。

FragmentTransaction替换行为

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

片段生命周期在25.1.0

上发生变化

onStart on new Fragment在之前的onStop之前被调用
当前状态:按预期工作。对我而言,它可能是app compat 25.0.x的重大变化 Issue link

片段中的恢复事件有两次也存在问题,请参阅here

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

答案 1 :(得分:3)

您可以在 CREATE TABLE #tt(col1 INT,col2 INT,col3 int) INSERT INTO #tt EXEC sp_MSforeachtable 'select * from ? where col1=''1'' and OBJECT_ID(''?'') in (OBJECT_ID(''table1''),OBJECT_ID(''table1''),OBJECT_ID(''table1'')) ' SELECT * FROM #tt 方法中添加list_view_header.xml,并更改所选项目的位置,例如navigationDrawer()

selectItem(position - 1)