如何让我的片段与另一个片段一起全屏显示,因为它的父片段不是 activity?

How Do I make my fragment go fullscreen with another fragment as it's parent not activity?

通常如果片段包含在activity中,我们可以这样做:

supportFragmentManager.beginTransaction()
     .add(android.R.id.content, OurFragment())
     .commit()

但是另一个片段呢?他们甚至没有 android.R.id.content 而且我知道这并非不可能,因为 DialogFragment 存在。问题是如何?除了覆盖 dialogfragment 之外还有其他方法吗?

如果您尝试创建没有 activity 的片段,您不可能做一件事来制作 activity 全屏(如果您也不需要该操作bar 你可以将主题设置为 AppTheme.NoActionBar )然后通过将片段的布局设置为匹配父级你也可以在片段内设置片段你可以通过将超级子片段放置到父活动的布局中来做到这一点子片段的布局.在你想要膨胀另一个片段的片段中使用它

android.app.FragmentManager fm = fragment.getChildFragmentManager();
fm.beginTransaction()
 .add(android.R.id.content, OurFragment())
 .commit()

我找到答案了

首先您需要在 manifest.xml

上添加 android.permission.SYSTEM_ALERT_WINDOW

然后在你的片段上

class YourFragment : Fragment(){

    lateinit var mTopView : View
    lateinit var windowManager: WindowManager

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val LAYOUT_FLAG: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            WindowManager.LayoutParams.TYPE_PHONE
        }
        val params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            LAYOUT_FLAG,
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT
        )

        windowManager = requireActivity().applicationContext
            .getSystemService(Context.WINDOW_SERVICE) as WindowManager

        val li = requireActivity().getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
        mTopView = li.inflate(R.layout.yourlayout, null)

        windowManager.addView(mTopView, params)
        return mTopView
    }

    override fun onDestroyView() {
        super.onDestroyView()
        windowManager.removeView(mTopView)
    }

}