8

Próbuję utworzyć aplikację, która zaimplementuje karty paska czynności. Jedna z kart powinna zawierać MapFragment.MapFragment w słupkach paska działania

Jak mogę zaimplementować pasek akcji z zakładkami, pod jednym z których znajduje się Fragment mapy?

Czy możesz mi pomóc, jak to zrobić?

Oto co mam do tej pory:

Główna klasa

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 
    } 
    } 
} 

fragment zajęcia są tylko zwrócenie inflater z układu .xml.

XML podzial:

main.xml (mapa powinna być na tym pliku 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:id="@+id/mainFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

</LinearLayout> 

settings.xml I 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> 

Próbowałem do dowiedzieć się, jak postępować przez kilka dni, ale jestem naprawdę zdezorientowany. Każda pomoc/wskazówki byłyby bardzo mile widziane.

Co się stanie z getLastNonConfigurationInstance()? Jest przestarzałe.

+0

przepraszam, myślałem, moje pytanie było jasny. Zmieniłem go, ale daj mi znać, czy wymaga on dalszej poprawy. – hermann

+0

Cóż, twoje ogólne pytanie jest jasne, ale potem podajesz nam garść kodu i nie wyjaśniasz, jaki jest problem z tym kodem. Posiadanie 'MapFragment' w zakładce paska akcji nie różni się od tego, że jakikolwiek inny fragment znajduje się w zakładce paska akcji. – CommonsWare

+0

Nie mogę jednak wymyślić, jak to zrobić. Po zmianie pliku main.xml i dodaniu fragmentu otrzymuję komunikat "Błąd kompilacji błędów klasy" spowodowany przez java.lang.IllegalArgumentException: Binarny plik XML nr 2: Zduplikowany identyfikator 0x7f040005, znacznik pusty lub identyfikator nadrzędny 0x1020002 z innym fragment dla com.google.android.gms.maps.MapFragment 12-28 21: 14: 07.991: E/AndroidRuntime (26189): \t na android.app.Activity.onCreateView (Activity.java:4722) ' – hermann

Odpowiedz

16

W poniższym przykładzie istnieje możliwość dodania mapy GoogleMap do paska czynności/menu rozwijanego. Kluczem do tego jest prawidłowe ustawienie fragmentu, aby zniszczyć MapFragment po przełączeniu na inny fragment na pasku akcji.

Załóż działalność, która implementuje funkcjonalność Action Bar:

  1. Tworzenie projektu w Eclipse, który używa Tabs dla głównej działalności. Jeśli tego nie zrobisz, przejdź do kroków 2-5.
  2. Utwórz klasę, która rozszerza Activity i implementuje ActionBar.OnNavigationListener.
  3. Utwórz plik XML układu, który jest kontenerem fragmentów kart po przełączeniu się między nimi.
  4. Zaimplementuj/zastąp następującą metodę w swojej klasie aktywności: public boolean onNavigationItemSelected(int position, long id).
  5. W tej metodzie przełącz się między obiektem position, aby określić wybraną kartę i ustawić fragment na nową instancję za pomocą narzędzia FragmentManager w następujący sposób: getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit().

Tworzenie fragment, który trzyma mapę:

  1. utworzyć klasę, która rozciąga Fragment użyć jako fragmentu Twojego tabulatora.Przeczytaj [1], aby lepiej zrozumieć MapFragment.
  2. Utwórz plik XML układu, który zawiera element fragmentu (jak widać w [1]). Użyj XML na tej stronie, aby utworzyć plik XML układu i użyć go w klasie fragmentów.
  3. Napełnij ten plik XML układu w klasie fragmentów przez przesłonięcie onCreateView.
  4. Twoja aplikacja powinna teraz wyświetlać mapę na karcie, która korzysta z klasy fragmentów, jednak przejście do innej karty i powrót do karty mapy spowoduje utworzenie duplikatu ID widoku. Aby temu zaradzić, przejdź do następnego kroku.
  5. W swojej klasie fragment, zastąpić następującą metodę, aby specjalnie zniszczyć stanowiącego podstawę przedmiotu kalkulacji tak, że może być odtworzony gdy karta mapa ładuje klasa fragment ponownie:

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

Dziękujemy! onDestroyView jest tym, czego potrzebuje mój kod :-) – sourcerebels

+1

Teraz używam: if (f! = null && f.isResumed()) lub otrzymuję Wyjątki podczas zamykania aplikacji naciskając przycisk Wstecz. TY – sourcerebels

+1

to działa, ale jeśli obrócę ekran, moja aplikacja ulega awarii z powodu tego wyjątku: Spowodowane przez: java.lang.IllegalStateException: Nie można wykonać tej akcji po onSaveInstanceState – jramoyo

-1

Nie jestem pewien, czy już to rozwiązałeś, czy nie. Musisz dodać usługi Google Play jako projekt biblioteczny, aby działał. Najpierw próbowałem dodać plik jar, ale to nie zadziałało.

+0

Jeśli google usługi odtwarzania nie są poprawnie skonfigurowane, a twoja mapa nie załaduje się. –

Powiązane problemy