【发布时间】:2018-12-20 15:53:44
【问题描述】:
我想创建一个包含 ViewPager 的对话框,其中包含 3 个页面,所有页面都有不同的布局结构。我想要一个解决方案,我可以以编程方式设置布局内容。我认为这可以通过为每个页面制作片段来完成,但我不知道该怎么做。
我浏览了这些答案,但我不知道如何在我的情况下使用它们。
【问题讨论】:
标签: android android-viewpager fragment android-dialog
我想创建一个包含 ViewPager 的对话框,其中包含 3 个页面,所有页面都有不同的布局结构。我想要一个解决方案,我可以以编程方式设置布局内容。我认为这可以通过为每个页面制作片段来完成,但我不知道该怎么做。
我浏览了这些答案,但我不知道如何在我的情况下使用它们。
【问题讨论】:
标签: android android-viewpager fragment android-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(StackOverflowError::class)
fun getItemAt(index: Int) : Fragment {
if (index >= fragmentList.size) throw StackOverflowError()
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
【讨论】: