2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidのViewPager内でMapを利用する方法

Last updated at Posted at 2018-04-09

ViewPagerの中にMapを配置するには、ViewPagerのAdapterとしてFragmentStatePagerAdapterを使用し、下記のような方法でFragmentを返します。

GitHubで、それぞれのサンプルコードを公開しています。下記にその概要を示します。

MapFragmentを返す

ViewPagerの中にMapのみを表示する場合はこの方法が一番簡単です。

サンプルコードでは、SupportMapFragmentを返しています。

MapFragmentPagerAdapter

class MapFragmentPagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {

    override fun getItem(position: Int): Fragment {
        return SupportMapFragment.newInstance()
    }

    // omitted

}

ListViewを入れたFragmentを返し、ListViewで自製セルを返す

ViewPagerの各ページではListViewを表示し、ListViewの中の自製セルでMapを表示する方法です。
自製セルは、ViewをFrameLayoutで定義し、そこにコンストラクタでSupportMapFragmentを追加しています。

MapListViewAdapter

class MapListViewAdapter(private val context: Context, private val fragmentManager: FragmentManager) : BaseAdapter() {

    private val inflater = LayoutInflater.from(context)

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        
        // omitted

        val mapView = MyMapView(this.context, this.fragmentManager)
        val layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 500)
        mapView.layoutParams = layoutParams
        return mapView
    }

    // omitted

}

MyMapView

class MyMapView(context: Context, fragmentManager: FragmentManager) : FrameLayout(context) {

    init {
        val inflater = LayoutInflater.from(context)
        val layoutView = inflater.inflate(R.layout.view_map, null)
        val view = layoutView.mapFrameLayout

        val mapFragment = SupportMapFragment.newInstance()
        fragmentManager.beginTransaction().add(view.id, mapFragment).commit()
        mapFragment.getMapAsync {
            // nothing
        }

        this.addView(layoutView)
    }

}

FrameLayoutを入れたFragmentを返す

ViewPagerの各ページのレイアウトにFrameLayoutを定義し、そこにSupportMapFragmentを追加する方法です。
このときfragmentManagerではなく、childFragmentManagerを使います。

MapPagerFragment

class MapPagerFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater!!.inflate(R.layout.fragment_map_pager, container, false)
        val mapView = view.mapView
        val mapFragment = SupportMapFragment.newInstance()
        this.childFragmentManager.beginTransaction().add(mapView.id, mapFragment).commit()
        mapFragment.getMapAsync {
            // nothing
        }
        return view
    }

    // omitted

}

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?