Skip to content

Android: Multiple maps cause Fragment crash #480

@m1ga

Description

@m1ga

When adding two maps into one window or view that app will crash:

const Map = require("ti.map");
var win = Titanium.UI.createWindow({
	layout: "vertical"
});
win.add(Map.createView({
	mapType: Map.NORMAL_TYPE,
	region: {
		latitude: 37.74,
		longitude: -122.41,
		latitudeDelta: 0.01,
		longitudeDelta: 0.01
	},
	animate: false,
	regionFit: true,
	userLocation: true,
	height: 250,
	width: Ti.UI.FILL,
}));

win.add(Map.createView({
	mapType: Map.NORMAL_TYPE,
	region: {
		latitude: 37.74,
		longitude: -122.41,
		latitudeDelta: 0.01,
		longitudeDelta: 0.01
	},
	animate: false,
	regionFit: true,
	userLocation: false,
	height: 250,
	width: Ti.UI.FILL
}))
win.open();

crash:

[ERROR] TiExceptionHandler: (main) [249,550] android.widget.ImageView cannot be cast to android.view.ViewGroup
[ERROR] TiExceptionHandler:
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:504)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
[ERROR] TiExceptionHandler:     androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
[ERROR] TiExceptionHandler:     androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
[ERROR] TiExceptionHandler:     org.appcelerator.titanium.TiBaseActivity.onStart(TiBaseActivity.java:1441)
[ERROR] TiExceptionHandler:     android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)
[ERROR] TiExceptionHandler:     android.app.Activity.performStart(Activity.java:8018)
[ERROR] TiExceptionHandler:     android.app.ActivityThread.handleStartActivity(ActivityThread.java:3457)
[ERROR] TiExceptionHandler:     android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
[ERROR] TiExceptionHandler:     android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
[ERROR] TiExceptionHandler:     android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
[ERROR] TiExceptionHandler:     android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
[ERROR] TiExceptionHandler:     android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
[ERROR] TiExceptionHandler:     android.os.Handler.dispatchMessage(Handler.java:106)
[ERROR] TiExceptionHandler:     android.os.Looper.loop(Looper.java:223)
[ERROR] TiExceptionHandler:     android.app.ActivityThread.main(ActivityThread.java:7664)
[ERROR] TiExceptionHandler:     java.lang.reflect.Method.invoke(Native Method)
[ERROR] TiExceptionHandler:     com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Ru

According to various sources like https://stackoverflow.com/a/39441496/5193915 it seems like a clash between IDs. If I had a new class as described here https://stackoverflow.com/a/16329503/5193915

CustomMapFragment.java

package ti.map;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.SupportMapFragment;

public class CustomMapFragment extends SupportMapFragment {

    public CustomMapFragment() {
        super();
    }


    public static CustomMapFragment newInstance() {
        CustomMapFragment frag = new CustomMapFragment();
        return frag;
    }

    public static CustomMapFragment newInstance(GoogleMapOptions googleMapOptions){
        Bundle arguments = new Bundle();
        arguments.putParcelable("MapOptions", googleMapOptions);

        CustomMapFragment frag = new CustomMapFragment();
        frag.setArguments(arguments);
        return frag;
    }

    @Override
    public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
        View v = super.onCreateView(arg0, arg1, arg2);
        return v;
    }
}

and use that in https://github.com/appcelerator-modules/ti.map/blob/master/android/src/ti/map/TiUIMapView.java#L129 and https://github.com/appcelerator-modules/ti.map/blob/master/android/src/ti/map/TiUIMapView.java#L141

with Fragment map = CustomMapFragment.newInstance(); and Fragment map = CustomMapFragment.newInstance(gOptions); I can see both maps.

Since I'm not sure if that is causing other issues I didn't create a PR yet 😄 But the example code is running fine after that change.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions