0

I'm developing an Android app that has the following layout. It is expected to have a map that covers most of the screen, a button at the bottom left and a camera button at the bottom right.

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

<data>
    <variable
        name="viewModel"
        type="com.example.assignment.view_model.Main2ViewModel" />
</data>

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.Main2Activity">

    <fragment xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="10"
        android:scrollbars="vertical" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:clickable="true"
        android:src="@drawable/ic_camera"
        android:background="@color/colorAccent"
        android:layout_gravity="bottom|right"
        android:elevation="20dp"/>

    <Button
        android:id="@+id/button_end"
        android:layout_width="303dp"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="16dp"
        android:background="@drawable/login_btn"
        android:backgroundTint="@color/colorPrimary"
        android:padding="16dp"
        android:text="Stop"
        android:textColor="#fff"
        android:textSize="18sp"
        android:textStyle="bold" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

</layout>

The emulator runs the layout just fine when it's without the <fragment> element, but it crashes when it's with it.

I am guessing that the <fragment> element does not work well with <layout> or androidx.coordinatorlayout.widget.CoordinatorLayout, but if I change such layout, ActivityMain2Binding in Main2Activity will go red:

public class Main2Activity extends AppCompatActivity implements OnMapReadyCallback {
    ActivityMain2Binding binding;
    private final int GALLERY = 101;
    final int RequestCameraPermissionID = 1001;
    ...
}

I am keeping the <fragment> element because it is linked to this map in Main2Activity:

// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

The stack trace:

2019-12-13 04:01:57.616 9957-9957/com.example.assignment E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.assignment, PID: 9957
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.assignment/com.example.assignment.ui.Main2Activity}: android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class fragment
 Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
 Caused by: java.lang.RuntimeException: API key not found.  Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
    at com.google.maps.api.android.lib6.drd.q.b(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):20)
    at com.google.maps.api.android.lib6.auth.e.a(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):10)
    at com.google.maps.api.android.lib6.impl.f.a(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):3)
    at com.google.android.gms.maps.internal.b.a(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):19)
    at com.google.android.gms.maps.internal.CreatorImpl.a(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):57)
    at com.google.android.gms.maps.internal.CreatorImpl.newMapFragmentDelegate(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):25)
    at com.google.android.gms.maps.internal.i.a(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):73)
    at fw.onTransact(:com.google.android.gms.dynamite_mapsdynamite@16089052@16.0.89 (040700-239467275):4)
    at android.os.Binder.transact(Binder.java:667)
    at com.google.android.gms.internal.maps.zza.zza(Unknown Source:10)
    at com.google.android.gms.maps.internal.zzf.zzc(Unknown Source:5)
    at com.google.android.gms.maps.SupportMapFragment$zzb.zzd(Unknown Source:12)
    at com.google.android.gms.maps.SupportMapFragment$zzb.createDelegate(Unknown Source:6)
    at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(Unknown Source:18)
    at com.google.android.gms.dynamic.DeferredLifecycleHelper.onInflate(Unknown Source:20)
    at com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown Source:21)
    at androidx.fragment.app.Fragment.onInflate(Fragment.java:1488)
    at androidx.fragment.app.FragmentManagerImpl.onCreateView(FragmentManagerImpl.java:3204)
    at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:134)
    at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
    at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:336)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
2019-12-13 04:01:57.617 9957-9957/com.example.assignment E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:303)
        at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:284)
        at com.example.assignment.ui.Main2Activity.onCreate(Main2Activity.java:114)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

In which I notice a line about the Main2Activity crash:

at com.example.assignment.ui.Main2Activity.onCreate(Main2Activity.java:114)

Which is this:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // This line below
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main2);
        binding.fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            ...
Alvin Mok
  • 323
  • 1
  • 14
  • 1
    Please [edit] your question to provide the complete [stack trace from the crash](https://stackoverflow.com/a/23353174). – Mike M. Dec 13 '19 at 04:01
  • 2
    Here's the problem: `API key not found. Check that is in the element of AndroidManifest.xml`. – Mike M. Dec 13 '19 at 04:12

0 Answers0