包含 ViewPager 的对话框
dialog containing ViewPager
我想创建一个对话框,其中包含 ViewPager,它有 3 个页面,所有页面都有不同的布局结构。我想要一个解决方案,我可以通过编程方式设置布局内容。我认为这可以通过为每个页面制作片段来完成,但我不知道该怎么做。
我仔细阅读了这些答案,但我不知道如何在我的案例中使用它们。
Viewpager in Dialog?
ViewPager in Custom Dialog
ViewPager in simple Dialog
您可以尝试通过 DialogFragment
构建您的自定义对话框。考虑 XML 布局将包含一个 ViewPager
并且要执行的代码将是:
class PagerDialog : DialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.element_fragment_pager_dialog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupPager()
}
private fun setupPager() {
val pagerFragment1 = PagerFragment1.newInstance()
val pagerFragment2 = PagerFragment2.newInstance()
val pagerFragment3 = PagerFragment3.newInstance()
viewPager?.adapter = MyFragmentPagerAdapter(childFragmentManager).apply {
adapterReference = object : PageAdapterInterface {
override var fragmentList: List<Fragment> =
mutableListOf(pagerFragment1, pagerFragment2, pagerFragment3)
}
}
}
companion object {
const val tag = "PagerDialog"
}
}
我使用了对列表的引用,因为如果处理不当可能会导致泄漏。所以 PagerAdapterInterface
看起来像:
interface PageAdapterInterface {
var fragmentList: List<Fragment>
fun getItemCount() = fragmentList.size
@Throws(WhosebugError::class)
fun getItemAt(index: Int) : Fragment {
if (index >= fragmentList.size) throw WhosebugError()
return fragmentList[index]
}
}
您的视图寻呼机适配器可以以引用访问的方式使用此引用,例如:
class MyFragmentPagerAdapter(childFragmentManager: FragmentManager) : FragmentStatePagerAdapter(childFragmentManager){
lateinit var adapterReference: PageAdapterInterface
override fun getItem(p0: Int): Fragment = adapterReference.getItemAt(p0)
override fun getCount(): Int = adapterReference.getItemCount()
}
最后在 Activity
或 Fragment
中 create()
或 onViewCreated()
函数中,您可以初始化对话框,如下所示:
class MyActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// use childFragmentManager if the code is
// used within the Fragment
val prev = supportFragmentManager.findFragmentByTag(PagerDialog.tag)
if (prev != null) {
supportFragmentManager.beginTransaction()
.remove(prev)
.addToBackStack(null)
.commit()
}
PagerDialog().show(supportFragmentManager, PagerDialog.tag)
}
}
注意: DialogFragment 已弃用 > API 28 查看 https://developer.android.com/reference/android/app/DialogFragment
我想创建一个对话框,其中包含 ViewPager,它有 3 个页面,所有页面都有不同的布局结构。我想要一个解决方案,我可以通过编程方式设置布局内容。我认为这可以通过为每个页面制作片段来完成,但我不知道该怎么做。
我仔细阅读了这些答案,但我不知道如何在我的案例中使用它们。
Viewpager in Dialog?
ViewPager in Custom Dialog
ViewPager in simple Dialog
您可以尝试通过 DialogFragment
构建您的自定义对话框。考虑 XML 布局将包含一个 ViewPager
并且要执行的代码将是:
class PagerDialog : DialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.element_fragment_pager_dialog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupPager()
}
private fun setupPager() {
val pagerFragment1 = PagerFragment1.newInstance()
val pagerFragment2 = PagerFragment2.newInstance()
val pagerFragment3 = PagerFragment3.newInstance()
viewPager?.adapter = MyFragmentPagerAdapter(childFragmentManager).apply {
adapterReference = object : PageAdapterInterface {
override var fragmentList: List<Fragment> =
mutableListOf(pagerFragment1, pagerFragment2, pagerFragment3)
}
}
}
companion object {
const val tag = "PagerDialog"
}
}
我使用了对列表的引用,因为如果处理不当可能会导致泄漏。所以 PagerAdapterInterface
看起来像:
interface PageAdapterInterface {
var fragmentList: List<Fragment>
fun getItemCount() = fragmentList.size
@Throws(WhosebugError::class)
fun getItemAt(index: Int) : Fragment {
if (index >= fragmentList.size) throw WhosebugError()
return fragmentList[index]
}
}
您的视图寻呼机适配器可以以引用访问的方式使用此引用,例如:
class MyFragmentPagerAdapter(childFragmentManager: FragmentManager) : FragmentStatePagerAdapter(childFragmentManager){
lateinit var adapterReference: PageAdapterInterface
override fun getItem(p0: Int): Fragment = adapterReference.getItemAt(p0)
override fun getCount(): Int = adapterReference.getItemCount()
}
最后在 Activity
或 Fragment
中 create()
或 onViewCreated()
函数中,您可以初始化对话框,如下所示:
class MyActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// use childFragmentManager if the code is
// used within the Fragment
val prev = supportFragmentManager.findFragmentByTag(PagerDialog.tag)
if (prev != null) {
supportFragmentManager.beginTransaction()
.remove(prev)
.addToBackStack(null)
.commit()
}
PagerDialog().show(supportFragmentManager, PagerDialog.tag)
}
}
注意: DialogFragment 已弃用 > API 28 查看 https://developer.android.com/reference/android/app/DialogFragment