8

Ich versuche eine App zu erstellen, die Aktionsleisten-Registerkarten implementiert. Eine der Registerkarten sollte ein MapFragment enthalten.MapFragment in der Aktionsleiste Tabs

Wie kann ich eine Aktionsleiste mit Tabs implementieren, unter denen sich ein Kartenfragment befindet?

Können Sie mir helfen, wie Sie damit fortfahren?

Hier ist, was ich bisher:

Hauptklasse

package com.nfc.demo; 

import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 

public class NFCDemoActivity extends Activity { 

    Tab selectedTab = null; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getActionBar(); 
    bar.setDisplayShowHomeEnabled(false); 
    bar.setDisplayShowTitleEnabled(false); 

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    bar.setCustomView(R.layout.main); 

    ActionBar.Tab mapTab = bar.newTab().setText("Map"); 
    ActionBar.Tab settingsTab = bar.newTab().setText("Settings"); 
    ActionBar.Tab aboutTab = bar.newTab().setText("About"); 

    MapFragment mapFragment = new MapFragment(); 
    SettingsFragment settingsFragment = new SettingsFragment(); 
    AboutFragment aboutFragment = new AboutFragment(); 

    mapTab.setTabListener(new TabListener(mapFragment)); 
    settingsTab.setTabListener(new TabListener(settingsFragment)); 
    aboutTab.setTabListener(new TabListener(aboutFragment)); 

    Tab selectedTab = (Tab) getLastNonConfigurationInstance(); 

    if (selectedTab == null) { 
     bar.addTab(mapTab, false); 
     bar.addTab(settingsTab, false); 
     bar.addTab(aboutTab, true); 
    } 

    setContentView(R.layout.main); 

    } 

    public Object onRetainNonConfigurationInstance() { 
    return selectedTab; 
    } 

    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    protected class TabListener implements ActionBar.TabListener { 
    private Fragment fragment; 

    public TabListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.replace(R.id.mainFragment, this.fragment, null); 
     selectedTab = tab; 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.remove(this.fragment); 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     //do nothing 
    } 
    } 
} 

Die Fragment-Klassen sind alle nur einen inflater mit einem XML-Layout zurück.

XML-Layout:

main.xml (Karte auf dieser XML-Datei sein soll)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

</LinearLayout> 

settings.xml UND about.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/textView123" 
     android:text="asdfg" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

ich versucht habe zu finde heraus, wie man für ein paar Tage vorgeht, aber ich bin wirklich verwirrt. Jede Hilfe/Tipps würde sehr geschätzt werden.

Und was ist mit getLastNonConfigurationInstance()? Es ist veraltet.

+0

sorry, dachte ich, meine Frage war klar. Ich habe es bearbeitet, aber lassen Sie mich wissen, wenn es weitere Verbesserungen benötigt. – hermann

+0

Nun, Ihre allgemeine Frage ist klar, aber dann übergeben Sie uns eine Menge Code und erklären Sie nicht, was das Problem mit diesem Code ist. Wenn sich ein MapFragment in einer Aktionsleisten-Registerkarte befindet, unterscheidet es sich nicht davon, dass sich ein anderes Fragment in einer Aktionsleisten-Registerkarte befindet. – CommonsWare

+0

Ich kann jedoch nicht herausfinden, wie es geht. Sobald ich die main.xml ändere und ein Fragment anfüge, bekomme ich einen 'Error inflationing class fragment' Fehler' verursacht durch java.lang.IllegalArgumentException: Binär XML Datei Zeile # 2: Duplicate ID 0x7f040005, Tag null, oder übergeordnete ID 0x1020002 mit einem anderen fragment für com.google.android.gms.maps.MapFragment 12-28 21: 14: 07.991: E/AndroidRuntime (26189): \t bei android.app.Activity.onCreateView (Activity.java:4722) ' – hermann

Antwort

16

In der folgenden Lösung ist es möglich, eine GoogleMap zu einer Aktionsleiste/Dropdown-Liste hinzuzufügen. Der Schlüssel dazu liegt in der korrekten Einrichtung des Fragments, um das MapFragment beim Wechseln zu einem anderen Fragment in der Aktionsleiste zu zerstören.

eine Aktivität erstellen, die die Aktionsleiste Funktionalität implementiert:

  1. ein Projekt in Eclipse erstellen, die Tabs für die Haupttätigkeit verwendet. Wenn Sie dies nicht tun, fahren Sie mit den Schritten 2-5 fort.
  2. Erstellen Sie eine Klasse, die Activity erweitert und implementiert ActionBar.OnNavigationListener.
  3. Erstellen Sie eine Layout-XML-Datei, die ein Container für Ihre Tab-Fragmente ist, wenn Sie zwischen ihnen wechseln.
  4. Implementieren Sie die folgende Methode in Ihrer Aktivitätsklasse: public boolean onNavigationItemSelected(int position, long id).
  5. Wechseln Sie in dieser Methode zwischen dem Objekt position, um die ausgewählte Registerkarte zu bestimmen, und setzen Sie das Fragment mit dem FragmentManager wie folgt auf eine neue Instanz: getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit().

ein Fragment erstellen, die die Karte enthält:

  1. Erstellen Sie eine Klasse, die Fragment als Registerkarte Fragment verwenden erstreckt.Lesen Sie [1], um das MapFragment besser zu verstehen.
  2. Erstellen Sie eine Layout-XML-Datei, die ein Fragmentelement enthält (siehe [1].) Verwenden Sie das XML auf dieser Seite, um eine XML-Layoutdatei zu erstellen und in Ihrer Fragmentklasse zu verwenden.
  3. Füllen Sie die XML-Layoutdatei in Ihrer Fragmentklasse auf, indem Sie onCreateView überschreiben.
  4. Ihre App sollte nun eine Karte in der Registerkarte anzeigen, die Ihre Fragmentklasse verwendet. Wenn Sie jedoch zu einer anderen Registerkarte und zurück zur Kartenregisterkarte wechseln, wird eine doppelte Ansichts-ID angezeigt. Um dies zu beheben, fahren Sie mit dem nächsten Schritt fort.
  5. In Ihrem Fragmente Klasse, die folgende Methode überschreibt, speziell das zugrunde liegende GoogleMap Objekt zu zerstören, so dass sie neu erstellt werden können, wenn die Map Registerkarte wieder Ihr Fragment Klasse laden:

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
     if (f != null) 
      getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
+0

Danke! onDestroyView ist, was mein Code braucht :-) – sourcerebels

+1

Jetzt benutze ich: if (f! = null && f.isResumed()) oder ich bekomme Ausnahmen beim Schließen meiner App durch Drücken der Zurück-Taste. TY – sourcerebels

+1

das funktioniert, aber wenn ich meinen Bildschirm drehen, stürzt meine App mit dieser Ausnahme ab: Verursacht von: java.lang.IllegalStateException: Kann diese Aktion nach onSaveInstanceState nicht ausführen – jramoyo

-1

Nicht sicher, ob Sie es bereits gelöst haben oder nicht. Sie müssen Google Play-Dienste als Bibliotheksprojekt hinzufügen, damit es funktioniert. Zuerst habe ich versucht, die JAR-Datei hinzuzufügen, aber das hat nicht funktioniert.

+0

Wenn google Play Services ist nicht richtig eingerichtet Ihre Karte würde nicht geladen werden. –