Mit einem knopf zwischen karte und einem anderen layout switchen

  • Antworten:9
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 6

18.12.2016 18:45:16 via Website

Hey leute,
(hoffe bin im richtigen forum bereich?)habe seit paar tagen ein Problem welches ich nicht lösen kann.
Ich möchte mit einem Button zwischen Map und einem Bliebigen Layout wechseln.

Die Map wird geöffnet, ich kann auch zum nächsten layout wechseln. aber wenn ich zurück wechseln will bekomme ich einen error und die App stürtzt ab.

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    karte();
}


public void karte()
{
    setContentView(R.layout.karte_test);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map_test);
    mapFragment.getMapAsync(this);

    Button gamesetmap=(Button)findViewById(R.id.gamesetmap);
    Button changetocam=(Button)findViewById(R.id.changetocam);
    TextView teams1=(TextView)findViewById(R.id.teamkd);
    TextView teams2=(TextView)findViewById(R.id.kda);

    changetocam.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            cam();
        }
    });

    teams1.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        teamkdas();
    }
});
    teams2.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            teamkdas();
        }
    });
    gamesetmap.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ingamesetpop();
        }
    });




}


public void cam()
{
    setContentView(R.layout.ingame_masteroverlay_layout);

    Button gamesetcam=(Button)findViewById(R.id.gamesetcam);
    Button changetomap=(Button)findViewById(R.id.changetomap);
    TextView teams1=(TextView)findViewById(R.id.teamkd);
    TextView teams2=(TextView)findViewById(R.id.kda);

    changetomap.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            karte();
        }
    });

    teams1.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            teamkdas();
        }
    });
    teams2.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            teamkdas();
        }
    });
    gamesetcam.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ingamesetpop();
        }
    });
}

Der Error ist folgender:

D/gralloc_ranchu: gralloc_unregister_buffer: exiting HostConnection (is buffer-handling thread)
D/AndroidRuntime: Shutting down VM

E/AndroidRuntime: FATAL EXCEPTION: main
Process: auftour.mrorhan.probieren, PID: 11256
android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f0f010b, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.SupportMapFragment
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2422)
at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:376)
at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:33)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:414)
at android.app.Activity.setContentView(Activity.java:2414)
at auftour.mrorhan.probieren.Game.karte(Game.java:38)
at auftour.mrorhan.probieren.Game$5.onClick(Game.java:101)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22265)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Ich habe keinen einzigen ansatz, so wäre ich für die kleineste hilfe schon sehr dankbar.
Gruß Orhan

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.302

18.12.2016 18:50:40 via Website

Hallo Orhan,
Fehler ist folgender:

 java.lang.IllegalArgumentException: Binary XML file line #6: Duplicate id 0x7f0f010b, tag null, or parent id 

Du hast ein fehhler in einer deiner XMLs Zeile 6.
Da sind dippelte IDs eingetragen...

Aber schau dir mal Fragments an, das ist glaube ich besser für dich

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 6

18.12.2016 19:52:36 via Website

Hey Pascal,
zunächstmal vielen dank für die schnelle antwort! Ich glaube mein Problem rührt daher, dass ich das Maps layout nicht schließe. Wie du sagst, sind da doppelte ID's... So was in der art habe ich befürchtet. vor allem da er das nochmalige setzen des karte_test immer als fehler angemeckert hat.
Weißt du wie ich die maps layout schließen kann?

(habs mit:
WindowManager wm = (WindowManager) getApplicationContext()
.getSystemService(Game.this.WINDOW_SERVICE);
wm.removeView(dummymap);
versucht, doch auch hier bekomme ich fehler, dass "....not attached to window manager")
Ich bin ziemlicher neuling und mir gehen langsam die ideen aus :D

Gruß Orhan

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.302

18.12.2016 19:56:37 via Website

Du musst etws Obejkt Orienterter denken:
1. Du hast eine Oberfläche mit Karte
2. Du hst eine Oberfläche ohne Karte

Was hindert dich daran, für beide Oberflächen eigene Activity zu nutzen?
Dann hast du das Problem nicht mehr.
Dann kannst du per startActivity immer umschalten

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 6

18.12.2016 20:18:20 via Website

Da hast du recht, so ähnlich wollte ich es auch machen. Doch da sind einige Probleme:
In "meiner app" nutzt der User ständig map und cam, hin und her.
Da habe ich angst, dass die Karte dann zu lange lädt?
Und weißt du vielleicht, wie ich es unanimiert wechseln lassen kann? (wenn man activity wechselt stockt das etwas, wenn man nur layout wechselt erscheint es sofort)

Nochmal danke für die super schnelle antwort!!!

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.302

18.12.2016 20:21:47 via Website

Dann nimmt man statt Activities einfach Fragments und hält diese im Speicher ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 6

18.12.2016 20:32:52 via Website

hast du vielleicht einen beispielcode, wie so was geht ? (angel)

  • Forum-Beiträge: 6

24.12.2016 19:29:47 via Website

Hey PAscal,
oder vielleicht ließt es noch ein anderer. Habe es nun mit Fragments probiert... doch bekomme ich eine Fehlermeldung... weiterhin in der zeile 6, also quasi ein verweis, wo map in das layout eingefügt wird ...
Vielleicht kannst du mir noch nen kleinen Tipp geben :/

Error:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: auftour.mrorhan.probieren, PID: 4002
java.lang.RuntimeException: Unable to start activity ComponentInfo{auftour.mrorhan.probieren/auftour.mrorhan.probieren.Game}: android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class fragment
Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.google.android.gms.maps.SupportMapFragment that is not a Fragment
at android.app.Fragment.instantiate(Fragment.java:617)
at android.app.Fragment.instantiate(Fragment.java:593)
at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2302)
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at auftour.mrorhan.probieren.MapsFragment.onCreateView(MapsFragment.java:19)
at android.app.Fragment.performCreateView(Fragment.java:2353)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
at android.app.BackStackRecord.run(BackStackRecord.java:815)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
at android.app.FragmentController.execPendingActions(FragmentController.java:371)
at android.app.Activity.performStart(Activity.java:6678)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.ClassCastException
at android.app.Fragment.instantiate(Fragment.java:618)
at android.app.Fragment.instantiate(Fragment.java:593) 
at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2302) 
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:858) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:518) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
at auftour.mrorhan.probieren.MapsFragment.onCreateView(MapsFragment.java:19) 
at android.app.Fragment.performCreateView(Fragment.java:2353) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171) 
at android.app.BackStackRecord.run(BackStackRecord.java:815) 
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 
at android.app.FragmentController.execPendingActions(FragmentController.java:371) 
at android.app.Activity.performStart(Activity.java:6678) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 

  • Forum-Beiträge: 6

28.12.2016 16:47:37 via Website

So habe nun das Problem behoben. Falls jemand irgendwann das gleiche problem haben sollte:
Mir hat folgende methode geholfen die ich in mein "FragmentActivity(von maps)" eingefügt habe.

@Override//
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    MapFragment fragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.map_test);
    fragment.getMapAsync(this);
}