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) {
...