如何让我的片段与另一个片段一起全屏显示,因为它的父片段不是 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)
}
}
通常如果片段包含在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)
}
}