【问题标题】:FragmentTransaction behaving differently for different android sdk releasesFragmentTransaction 对于不同的 android sdk 版本表现不同
【发布时间】:2020-07-15 20:42:44
【问题描述】:

我正在build.gradle 中开发一个 android 项目

android {
    compileSdkVersion 25
}
dependencies {
    implementation 'com.android.support:support-v13:25.+'
}

我有一个名为 HistoryFragment.java 的类

public class HistoryFragment extends Fragment {

    private RecentHistoryPagerAdapter historyPagerAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.view_pager, container, false);
        if (savedInstanceState == null) {
            historyPagerAdapter = new HistoryPagerAdapter(getChildFragmentManager());
            viewPager = (ViewPager) rootView.findViewById(R.id.view_pager);
            viewPager.setAdapter(historyPagerAdapter);
            setTabListeners();
        }
        return rootView;
    }

    public void viewSummary () {
        HistoryFragment historyFragment = (HistoryFragment) getActivity().getFragmentManager().findFragmentById(R.id.container);
        FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction();
        transaction.hide(historyFragment);
        
        SummaryFragment summaryFragment = SearchResultSummaryFragment.newInstance();
        transaction.add(R.id.container, summaryFragment, "summaryFragment");
        transaction.commit();
        return;

这里,

HistoryPagerAdapter extends android.support.v13.app.FragmentPagerAdapter

它可以正常工作并导致此结果。

我将其复制到另一个项目中,并在其 build.gradle 中使用了这个

android {
    compileSdkVersion 27
}
dependencies {
    implementation 'com.android.support:support-v13:27.1.1'
}

它的行为不正确。虽然SummaryFragment 确实出现了,但它保留了historyPagerAdapter,正如我们在下一张图片中看到的那样

【问题讨论】:

  • android.support 类已全部弃用,不再接收错误修复或新功能,并且不应在新代码中使用。你应该migrate to AndroidX。自您使用的版本以来,已修复 许多 片段错误。我不知道这是否是其中之一,但这是我会尝试的第一件事,因为您使用的代码非常过时。
  • 你为什么不使用androidx.* api 而不是android.support.*?? android.* 更简单健壮的统一api

标签: android android-fragments fragmenttransaction


【解决方案1】:

正如 cmets 中已经建议的那样,我还建议将您的项目切换到 AndroidX 库。这可以通过右键单击您的模块(在“项目”窗格中)轻松完成,然后选择Refactor...,然后选择Migrate to AndroidX...

然后,Android Studio 将用新的 androidx 依赖项替换您的 gradle 依赖项,并相应地更改所有 import 语句。我也在大型多模块项目中做到了这一点,并且每次都几乎完美地工作。也许您必须在这里和那里调整导入。

具体到您的问题,片段的新等级依赖项是 implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'(如果您使用 Java,则没有“-ktx”)。

您不应该也不能将android.supportanroidx. 混合使用。这是一个或另一个。两者一起不起作用!

您可以在此处找到所有新依赖项的概述:https://developer.android.com/jetpack/androidx/migrate/class-mappings

【讨论】:

  • 这对我不起作用。此外,我正在使用androidx.viewpager.widget.ViewPager,并使用了很多现在已弃用的方法。一种这样的方法是getActivity().getActionBar().setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_TABS) 除了重构它,我还有其他选择吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2017-01-17
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多