Сбой активности на инфляции при использовании фрагмента карты (kotlin) - PullRequest
0 голосов
/ 27 октября 2019

Я создаю приложение, которое имеет много взаимодействий с картой, и одно из них видит маленькую карту внутри Activity, где пользователи смогут выбрать точку на карте и отправить запрос в наш API.

Моя проблема в том, что после того, как я сделал фрагмент для загрузки карт Google и добавил его в активность, которая должна показывать его, само действие начало падать при посадке на него. Отлаживая приложение, я вижу, что происходит сбой в SetContentView действия.

Вот XML-код действия:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FaleConoscoActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </com.google.android.material.appbar.AppBarLayout>

    <LinearLayout
        android:id="@+id/ll_main_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:paddingLeft="25dp"
        android:paddingTop="70dp"
        android:paddingRight="25dp"
        android:paddingBottom="40dp"
        app:layout_anchor="@+id/ll_main_layout"
        app:layout_anchorGravity="center">


        //Some EditTexts and Buttons


        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <fragment
                android:id="@+id/fragment"
                android:name="com.example.dumper2.MapFragment"
                tools:layout="@layout/fragment_map"
                android:layout_width="match_parent"
                android:layout_height="294dp" />
        </FrameLayout>



    </LinearLayout>

    ...
</androidx.coordinatorlayout.widget.CoordinatorLayout>

Код Котлина для действия:

class CadastroDePontoActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cadastro_de_ponto)
     }



    //Some other interactions


}

А вот XML и Kotlin для фрагмента:

<FrameLayout 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"
    tools:context=".MapFragment">

    <fragment
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/mapFrag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

Kotlin:

class MapFragment : Fragment(), OnMapReadyCallback  {
    private var param1: String? = null
    private var param2: String? = null
    private var listener: OnFragmentInteractionListener? = null

    private lateinit var mMap: GoogleMap

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
         ): View? {
        // Inflate the layout for this fragment
        val rootView = inflater.inflate(R.layout.fragment_map, container, 
        false)
        val mapFragment = childFragmentManager.findFragmentById(R.id.mapFrag)as SupportMapFragment
        mapFragment.getMapAsync(this)

        return rootView
      }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnFragmentInteractionListener) {
            listener = context
        } else {
            throw RuntimeException(context.toString() + " must implement 
            OnFragmentInteractionListener")
        }
     }

    override fun onDetach() {
        super.onDetach()
        listener = null
     }

    interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        fun onFragmentInteraction(uri: Uri)
     }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
    }


    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment MapFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            MapFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
     }

}

1 Ответ

1 голос
/ 27 октября 2019

Без аварийного журнала это просто предположение, но я не вижу, чтобы ваша деятельность расширяла OnFragmentInteractionListener, поэтому в onAttach это вызвало бы исключение RuntimeException.

...