【问题标题】:Accessing FragmentManager in a custom view class在自定义视图类中访问 FragmentManager
【发布时间】:2016-04-18 02:28:01
【问题描述】:

在我的自定义视图中,我有一个运行简单游戏的 Java 类。游戏结束后,我想显示我的DialogFragment,但getFragmentManager() 方法似乎未定义。

FragmentManager manager = getFragmentManager();
Finish finish = new Finish();
finish.show(manager, "done");

我尝试通过Fragment obj 让经理成为:

Fragment fragment = new Fragment();
FragmentManager manager = fragment.getFragmentManager();

但是返回为空。我知道这是一个新的Fragment 实例,但我不确定要赋予它什么价值。任何帮助将不胜感激。

【问题讨论】:

  • 您的View 不应直接与FragmentManager 交互。相反,创建一个您的Activity 可以实现的接口,通过该接口您的View 可以发出游戏完成的信号,并在Activity 的接口方法中执行FragmentTransaction
  • 那么类似于父视图中的静态方法,并调用它来表示游戏完成(并在那里继续我的片段)?
  • 没有。如果没有一些不稳定的参数中继,您将无法从static 方法访问FragmentManager。使用interface
  • 好吧,我只是对如何发出信号有点模糊。因此,如果我制作接口,并在 Activity 中实现它,我的 View 将如何使用该接口向 Activity 发出信号?
  • 非常感谢它现在工作得很好!

标签: java android android-fragments


【解决方案1】:

如果您的视图附加到Activity,那么您可以这样做

((Activity)getContext()).getFragmentManager();

((ActivityCompat)getContext()).getSupportFragmentManager();

为了更安全,请确保您检查 View Context 是否是 Activity 的实例:

if(getContext() instanceof Activity)// do something

更好的解决方案是,我依赖ViewActivity 之间的回调。

【讨论】:

  • 现在是((AppCompatActivity) getContext()).getSupportFragmentManager()
【解决方案2】:

我使用那个简单的辅助方法:

fun getFragmentManager(context: Context?): FragmentManager? {
    return when (context) {
        is AppCompatActivity -> context.supportFragmentManager
        is ContextThemeWrapper -> getFragmentManager(context.baseContext)
        else -> null
    }
}

【讨论】:

    【解决方案3】:

    您可以使用它(在 Kotlin 中):

    if ((context as ContextThemeWrapper).baseContext is AppCompatActivity) {
                //View is attached to an AppCompatActivity
            } else {
                //View is not attached to an AppCompatActivity
            }
    }
    

    【讨论】:

      【解决方案4】:

      AndroidX,可以试试:

      ContextThemeWrapper themeWrapper = (ContextThemeWrapper) getContext();
      FragmentManager fm = ((AppCompatActivity) themeWrapper.getBaseContext()).getSupportFragmentManager();
      

      根据@k0sh 的建议,建议instaceof 进行安全检查。

      【讨论】:

        猜你喜欢
        • 2015-09-12
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多