Android:如何将片段加载到FrameLayout中

14

我正在学习Android,我的项目中使用了BottomBar。它非常好用,运行得很稳定。我的应用程序代码与教程中的几乎完全相同,唯一不同的是我的MainActivity继承自AppCompatActivity

现在我想要做的是在FrameLayout中加载片段:

<!-- This could be your fragment container, or something -->
<FrameLayout
    android:id="@+id/contentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottomBar"
    />

为了达到这个目的,我正在尝试使用下面这段代码,这是我通过谷歌搜索解决我的问题时找到的:
// Create new fragment and transaction
QrCodeFragment newFragment = new QrCodeFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.bottomBar, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

该行代码 transaction.replace(R.id.bottomBar, newFragment); 报错,因为 newFragment 的类型应该是 android.app.Fragment。我的 QrCode 类: public class QrCodeFragment extends Fragment 由于今天我开始学习 Android,所以我不确定自己是否做得正确。我很困惑是否应该将片段加载到 FrameLayout 中,如果是这样的话,我做错了什么,无法加载它。我知道这是我的片段类型问题,但我不知道如何创建具有所需类型的片段。我使用 Android Studio > New > Fragment > Fragment (Blank) 创建了它。
感谢任何帮助。
更新: 我在这篇文章中找到了解决方案,但即使没有错误,我仍然看不到片段。

据我所了解,容器是你将片段充气到其中的地方。也就是说,如果你把它充气到FrameLayout中,它应该还是可以的 - 试一下吧。如果“complain”表示编译错误或崩溃,你应该加以说明。 - Zoe stands with Ukraine
@LunarWatcher 我已经找到问题了,现在不再出现错误。我应该导入android.app.Fragment;而不是import android.support.v4.app.Fragment;。现在的问题是它没有显示我刚刚设置要显示的片段。 - André Luiz
3个回答

21

首先,您的Fragment事务行有一个错误,根据您的布局应该是:

transaction.replace(R.id.contentContainer, newFragment); // not R.id.bottomBar

其次,你应该使用 supportFragmentManager 而不是 fragmentManager 来处理支持的片段,因此请按照以下方式实现:

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

感谢您的回答,它解决了这个问题。实际上,我只需要放入正确的 ID (contentContainer)。 - André Luiz

2
在我的情况下,我通过使用解决了这个问题。
androidx.fragment.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

替换你的

FragmentTransaction(片段事务)


1
            bottomNavigationView= findViewById(R.id.bottom_navigation);
           bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {



               @SuppressLint("NonConstantResourceId")
               @Override
               public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                   Fragment temp =null;
                   switch (item.getItemId()) {
                       case R.id.library:
                            temp = new LibraryFragment();

                           
                           break;
                       case R.id.search:
                           temp = new SearchFragment();
                           break;
                       case R.id.profile:
                           temp = new UserprofileFragment();
                           break;
                       default:
                   }
                  

               getSupportFragmentManager().beginTransaction().replace(R.id.fragment, temp).commit();


                        return true;
               }
           });


    getSupportFragmentManager().beginTransaction().replace(R.id.fragment,new SearchFragment()).commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接