¿ Por qué se me detiene la aplicación al usar este pequeño código? – java android bottombar

Pregunta:


Tengo un bottomBar donde tengo 5 opciones, la última es la del mapa de google API.

Mi problema es que al hacer click en esta pestaña el mapa carga todo correcto y funciona, me voy a otra pestaña y también bien, pero al volver al mapa de nuevo, se me crashea, ¿ por qué ?

Map_Fragment.java:

public class Map_fragment extends Fragment implements OnMapReadyCallback {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.activity_map, container, false);

        MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.mapid);
        mapFragment.getMapAsync(this);

        return v;
    }

    @Override
    public void onMapReady(GoogleMap map) {

        LatLng Malaga = new LatLng(36.6981483, -4.4513236);
        LatLng Melilla = new LatLng(35.2896931, -2.9427164);
        LatLng LasPalmas = new LatLng(28.135612, -15.4319612);
        LatLng Bilbao = new LatLng(43.271771,-2.9483674);
        LatLng Leon = new LatLng(42.5964305, -5.5733429);



        if (Build.VERSION.SDK_INT >= 23 &&
                ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        map.setMyLocationEnabled(true);
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(RudeBoys, 5)); // ZOOM AL EMPEZAR EL GOOGLE MAP




        map.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.mapfinal))
                .title("CLUB DE LA LUCHA")
                .snippet("Málaga")
                .position(Malaga));

        map.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.mapfinal))
                .title("ON FITNESS SHOP")
                .snippet("Melilla")
                .position(Melilla));

        map.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.mapfinal))
                .title("Sport Nutrition La Isletan")
                .snippet("Las palmas")
                .position(LasPalmas));

        map.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.mapfinal))
                .title("KANCHO OYAMA")
                .snippet("Bilbao")
                .position(Bilbao));

        map.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.mapfinal))
                .title("Power Fitness León")
                .snippet("León")
                .position(Leon));




    }
}

MainActivity1.java donde llamo a las pestañas, repito, van todas perfectas salvo si entro por 2a vez a la última, a la del mapa.

public class MainActivity1 extends AppCompatActivity {

    BottomBar mBottomBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setLogo(R.mipmap.ic_launcher);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().setNavigationBarColor(getResources().getColor(R.color.black));
        }

        mBottomBar = BottomBar.attach(this, savedInstanceState);
        mBottomBar.setItemsFromMenu(R.menu.menu_main, new OnMenuTabSelectedListener() {

            @Override
            public void onMenuItemSelected(@IdRes int i) {


                if (i == R.id.one) {

                    First_fragment f1 = new First_fragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.frame, f1).commit();
                }

                if (i == R.id.two) {

                    Second_fragment f2 = new Second_fragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.frame, f2).commit();
                }

                if (i == R.id.three) {

                    Three_fragment f3 = new Three_fragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.frame, f3).commit();
                }

                if (i == R.id.four) {

                    Four_fragment f4 = new Four_fragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.frame, f4).commit();
                }

                if (i == R.id.five) {
                    Map_fragment f5 = new Map_fragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.frame, f5).commit();
                   // startActivity(new Intent(MainActivity1.this, MapActivity.class));


                }

            }

        });

        mBottomBar.mapColorForTab(0, "#c92029");
        mBottomBar.mapColorForTab(1, "#c92029");
        mBottomBar.mapColorForTab(2, "#c92029");
        mBottomBar.mapColorForTab(3, "#c92029");
        mBottomBar.mapColorForTab(4, "#c92029");

        // seems this is  working to highlist tab
        mBottomBar.selectTabAtPosition(0, true);


        // Loading first Fragment to FrameLayout manually
        First_fragment f1 = new First_fragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.frame, f1).commit();


    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        mBottomBar.onSaveInstanceState(outState);
    }

    @Override
    public boolean onCreateOptionsMenu (Menu menu) {
    getMenuInflater().inflate(R.menu.menu_admin,menu);


    return true;
}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        int id = item.getItemId();
        if (id == R.id.share) {


            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
            sharingIntent.setType("text/plain");
            String shareBody = "Descárgate ya la App  ";
            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
            startActivity(Intent.createChooser(sharingIntent, "Share via"));

        }
        return super.onOptionsItemSelected(item);
    }
}

ERROR:

E/AndroidRuntime: FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #7: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.prueba.rudeboys.rudeboys1.Map_fragment.onCreateView(Map_fragment.java:30)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2074)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:532)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5317)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f0c0075, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
at android.app.Activity.onCreateView(Activity.java:4921)
at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:36)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
at com.prueba.rudeboys.rudeboys1.Map_fragment.onCreateView(Map_fragment.java:30) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2074) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) 

activity_map.xml :

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

Preguntado por: Rf Mvs

Comunidad

hago referencia a una pregunta de StackOverFlow en ingles

Inflating class mapfragment

Donde dice que debes cambiar en tu activity_map.xml

android:name="com.google.android.gms.maps.MapFragment"

Por

android:name="com.google.android.gms.maps.SupportMapFragment"

La diferencia entre MapFragment y SupportMapFragment es que esta ultima trabaja con APIs inferiores a 10 y tambien superiores a 11.

Tambien otro cambio que debes considerar es que debes cambiar el casteo que haces para tu MapFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.mapid);
    mapFragment.getMapAsync(this);
}

Eso lo dejo referencia a un error similar al tuyo, por otro lado y por comentario mio creo que si sales de tu mapa y despues vuelves a entrar, tambien seria una muy buena opcion llamar a onDestroyView()

@Override
public void onDestroyView() {
    Fragment fragment = (Fragment) getFragmentManager().findFragmentById(R.id.mapid);        
    if (fragment  != null) {
        getFragmentManager().beginTransaction().remove(fragment).commit();
    }
    super.onDestroyView();   
}     

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *