如何在 Activity(非 AppCompatActivity)中打开片段?

Posted

技术标签:

【中文标题】如何在 Activity(非 AppCompatActivity)中打开片段?【英文标题】:How to open a fragment in a Activity(non-AppCompatAcitivity)? 【发布时间】:2020-11-15 21:25:35 【问题描述】:

正如标题所述,我想打开一个位于 Activity(Non AppCompatActivity) 中的 Fragment

代码:

TableFragment fragment = new TableFragment();
  fragment.setArguments(bundle);
  View view = (View) findViewById(R.id.Example);
  AppCompatActivity activity = (AppCompatActivity) view.getContext().getApplicationContext();
  FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
  ft.replace(R.id.idFragment, fragment);
  ft.commit();

错误:原因:

java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity

也试过了:

Activity activity = (Activity) this;
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction ft= fragmentManager.beginTransaction();
TableFragment fragment = new TableFragment();
ft.replace(R.id.idFragment, fragment);
ft.commit();

错误:

Required type: androidx.fragment.app.FragmentTransaction
Provided: android.app.FragmentTransaction

问题:如何在 Activity 中打开 Fragment(非 AppCompatActivity)?

【问题讨论】:

TableFragment 正在扩展Fragment 的AndroidX 版本。托管它的活动需要从 AndroidX FragmentActivity 扩展。 AppCompatActivity 执行此操作,但您可以自己扩展 FragmentActivity。如果您不想这样做,那么您的活动将无法显示TableFragment 你的意思是你的activity扩展了Activity吗? @CommonsWare,谢谢你成功了。转发你的答案 【参考方案1】:

TableFragment 正在扩展Fragment 的AndroidX 版本。托管它的 Activity 需要从 AndroidX FragmentActivity 扩展。

AppCompatActivity 执行此操作,但出于某种原因您不想使用它。这很好,因为您可以自己扩展 FragmentActivity

如果您不想这样做,那么您的活动将无法显示TableFragment。您需要让 TableFragment 扩展已弃用的 Fragment 的框架版本。

【讨论】:

以上是关于如何在 Activity(非 AppCompatActivity)中打开片段?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过线程更新非 MainActivity 活动?

找不到来自非 activity_main.xml 的视图

非 Activity 类中的 findViewById

将 View 从 setContentView 传递给非 Activity 类

Kotlin 特殊的registerActivityLifecycleCallbacks+一个非Activity转跳到另一个Activity

在扩展 AsyncTask 的类中使用 DoInBackground 方法更改非 MainActivity 的 Activity 中 TextView 的文本