带有导体控制器的 ViewPager
ViewPager with Conductor Controller
我正在尝试使用 Conductor 的 viewPager(RouterPagerAdapter),一切正常。当我尝试使用当前控制器的路由器实例推送另一个控制器时出现问题。
它是视图寻呼机的适配器。
class ReaderAdapter(host: Controller) : RouterPagerAdapter(host) {
override fun configureRouter(router: Router, position: Int) {
if (!router.hasRootController()) {
when (position) {
0 -> router.setRoot(RouterTransaction.with(FeedController()))
1 -> router.setRoot(RouterTransaction.with(RssController()))
}
}
}
override fun getPageTitle(position: Int) = if (position == 0) "FEED" else "RSS"
override fun getCount() = 2
}
这是观点:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/feedTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="6dp"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
tools:targetApi="lollipop" />
<android.support.v4.view.ViewPager
android:id="@+id/feedPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我初始化适配器的方式:
class HostReaderController : BaseController() {
companion object {
const val TAG_UP_TRANSACTION = "TAG_UP_TRANSACTION"
}
override fun onInject() {
}
override fun onAttach(view: View) {
feedPager?.adapter = ReaderAdapter(this)
feedTab?.setupWithViewPager(feedPager)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
return inflater.inflate(R.layout.host_reader_view, container, false)
}
override fun onDestroyView(view: View) {
feedPager?.adapter = null
feedTab?.setupWithViewPager(null)
super.onDestroyView(view)
}
override fun getEnableBackAction() = false
override fun getTitleToolbar() = ""
}
现在我可以更好地解释问题了。当视图是 RSSController()
时,它是一个选项卡,有一个用于共享内容的按钮,所以我必须像这样打开一个新的控制器 ShareController:
rssController.router.pushController(RouterTransaction.with(ShareController()))
如果我这样做,ShareController 将在视图寻呼机中创建为 RSSController()
的视图。我想要的是在不在 viewPager 之外的地方创建一个新视图。我做了一个技巧来解决这个问题:
mainActivity.router.pushController(RouterTransaction.with(ShareControler))
如果我尝试使用 FeedController
和 RssController
的路由器推送一个新控制器,视图将创建为启动控制器的子视图。我该如何解决?
谢谢 :D
您看到的是正确的。每个页面都有自己的路由器,因此您推送的任何内容都将在该页面上结束,而不是在父容器中。您可能想要做的是 parentController.router.pushController()
.
我正在尝试使用 Conductor 的 viewPager(RouterPagerAdapter),一切正常。当我尝试使用当前控制器的路由器实例推送另一个控制器时出现问题。
它是视图寻呼机的适配器。
class ReaderAdapter(host: Controller) : RouterPagerAdapter(host) {
override fun configureRouter(router: Router, position: Int) {
if (!router.hasRootController()) {
when (position) {
0 -> router.setRoot(RouterTransaction.with(FeedController()))
1 -> router.setRoot(RouterTransaction.with(RssController()))
}
}
}
override fun getPageTitle(position: Int) = if (position == 0) "FEED" else "RSS"
override fun getCount() = 2
}
这是观点:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/feedTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:elevation="6dp"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
tools:targetApi="lollipop" />
<android.support.v4.view.ViewPager
android:id="@+id/feedPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我初始化适配器的方式:
class HostReaderController : BaseController() {
companion object {
const val TAG_UP_TRANSACTION = "TAG_UP_TRANSACTION"
}
override fun onInject() {
}
override fun onAttach(view: View) {
feedPager?.adapter = ReaderAdapter(this)
feedTab?.setupWithViewPager(feedPager)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
return inflater.inflate(R.layout.host_reader_view, container, false)
}
override fun onDestroyView(view: View) {
feedPager?.adapter = null
feedTab?.setupWithViewPager(null)
super.onDestroyView(view)
}
override fun getEnableBackAction() = false
override fun getTitleToolbar() = ""
}
现在我可以更好地解释问题了。当视图是 RSSController()
时,它是一个选项卡,有一个用于共享内容的按钮,所以我必须像这样打开一个新的控制器 ShareController:
rssController.router.pushController(RouterTransaction.with(ShareController()))
如果我这样做,ShareController 将在视图寻呼机中创建为 RSSController()
的视图。我想要的是在不在 viewPager 之外的地方创建一个新视图。我做了一个技巧来解决这个问题:
mainActivity.router.pushController(RouterTransaction.with(ShareControler))
如果我尝试使用 FeedController
和 RssController
的路由器推送一个新控制器,视图将创建为启动控制器的子视图。我该如何解决?
谢谢 :D
您看到的是正确的。每个页面都有自己的路由器,因此您推送的任何内容都将在该页面上结束,而不是在父容器中。您可能想要做的是 parentController.router.pushController()
.