27 votes

Utilisation d'ActionBarSherlock avec le nouveau SupportMapFragment

Je suis à la recherche à l'aide de ActionbarSherlock mais avoir une requête qui me retient.

Donc, ma demande doit être entièrement compatible avec les API de Niveau 7.

J'ai besoin de mettre en œuvre la nouvelle version de Google Maps dans mon application, et pour ce faire j'ai besoin d'utiliser la SupportMapFragment classe.

** Ma Question **

Est-il possible d'utiliser l' SupportMapFragment classe aux côtés ActionBarSherlock?

Merci d'avance

MODIFIER

J'ai téléchargé et avait un look à la bibliothèque. Les seules modifications de l'étendue Fragments je peux voir sont très simple et identique pour tous.

Pensez-vous que je pourrait ajouter la prise en charge moi-même?

voici comment ils sont pris en charge.

package com.actionbarsherlock.app;

import android.app.Activity;
import android.support.v4.app.DialogFragment;
import com.actionbarsherlock.internal.view.menu.MenuItemWrapper;
import com.actionbarsherlock.internal.view.menu.MenuWrapper;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener;
import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener;
import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener;

public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener {
    private SherlockFragmentActivity mActivity;

public SherlockFragmentActivity getSherlockActivity() {
    return mActivity;
}

@Override
public void onAttach(Activity activity) {
    if (!(activity instanceof SherlockFragmentActivity)) {
        throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity.");
    }
    mActivity = (SherlockFragmentActivity)activity;

    super.onAttach(activity);
}

@Override
public void onDetach() {
    mActivity = null;
    super.onDetach();
}

@Override
public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) {
    onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater());
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    //Nothing to see here.
}

@Override
public final void onPrepareOptionsMenu(android.view.Menu menu) {
    onPrepareOptionsMenu(new MenuWrapper(menu));
}

@Override
public void onPrepareOptionsMenu(Menu menu) {
    //Nothing to see here.
}

@Override
public final boolean onOptionsItemSelected(android.view.MenuItem item) {
    return onOptionsItemSelected(new MenuItemWrapper(item));
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    //Nothing to see here.
    return false;
}

}

61voto

Mudar Points 1236

Tout cela fonctionne comme un charme, principalement grâce à Jake de l'excellent travail sur ActionBarSherlock

Voici les étapes que j'ai suivi:

  1. Créer un SherlockMapFragment classe dans votre actiobarsherlock projet de bibliothèque. J'ai simplement fait une copie de SherlockFragment parce que j'ai aussi besoin de soutien pour setHasOptionsMenu(true)
  2. L'activité s'étend SherlockFragmentActivity (comme d'habitude)
  3. Le fragment s'étend le nouvellement créé SherlockMapFragment
  4. ActionBarSherlock exige le nouveau google-play-services_lib bibliothèque
  5. Votre projet nécessite la ActionBarSherlock de la bibliothèque. Pas besoin de les inclure dans google-play-services à nouveau, ou pour la génération de l'API Google.
  6. Comme mentionné par Graham, vous devez laisser tomber le support pour l'API 7 appareils: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

Et voici un code pour une explication plus détaillée:

SherlockMapFragment

package com.actionbarsherlock.app;

import com.actionbarsherlock.internal.view.menu.MenuItemWrapper;
import com.actionbarsherlock.internal.view.menu.MenuWrapper;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.google.android.gms.maps.SupportMapFragment;

import android.app.Activity;
import android.support.v4.app.Watson.OnCreateOptionsMenuListener;
import android.support.v4.app.Watson.OnOptionsItemSelectedListener;
import android.support.v4.app.Watson.OnPrepareOptionsMenuListener;

public class SherlockMapFragment extends SupportMapFragment
        implements OnCreateOptionsMenuListener,
        OnPrepareOptionsMenuListener,
        OnOptionsItemSelectedListener {
    private SherlockFragmentActivity mActivity;

    public SherlockFragmentActivity getSherlockActivity() {
        return mActivity;
    }

    @Override
    public void onAttach(Activity activity) {
        if (!(activity instanceof SherlockFragmentActivity)) {
            throw new IllegalStateException(getClass().getSimpleName()
                    + " must be attached to a SherlockFragmentActivity.");
        }
        mActivity = (SherlockFragmentActivity) activity;

        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        mActivity = null;
        super.onDetach();
    }

    @Override
    public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) {
        onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater());
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Nothing to see here.
    }

    @Override
    public final void onPrepareOptionsMenu(android.view.Menu menu) {
        onPrepareOptionsMenu(new MenuWrapper(menu));
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        // Nothing to see here.
    }

    @Override
    public final boolean onOptionsItemSelected(android.view.MenuItem item) {
        return onOptionsItemSelected(new MenuItemWrapper(item));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Nothing to see here.
        return false;
    }
}

L'activité:

public class MainActivity extends SherlockFragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

L'activité XML mise en page:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/fragment_map"
        android:name=".ui.fragments.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:tag="tag_fragment_map" />

    <fragment
        android:id="@+id/fragment_help"
        android:name=".ui.fragments.HelpFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:tag="tag_fragment_help" />
</FrameLayout>

Le fragment de carte:

public class MapFragment extends SherlockMapFragment {
    private GoogleMap mMap;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = super.onCreateView(inflater, container, savedInstanceState);
        mMap = getMap();
        return root;
    }
}

4voto

Graham Smith Points 7963

J'ai entendu dire que Jake ne va pas trop en faire plus à l'APA que Google peut être apporter leur propre arrière-compatible ActionBar. Je pense que si je me souviens bien, il a été discuté dans l'un des liés Android de Google+ hangouts.

Les nouvelles cartes nécessite API de niveau 8 onward donc, avant même de se soucier de l'actionbar vous allez courir dans des problèmes si vous devez prendre en charge l'API de niveau 7.

Mon conseil serait de produire 2 mise en page des fichiers, un pour le niveau 7 et et un pour 8+. Dans le niveau 7, utilisez la vieillesse MapView bien qu'ils sont autodérision, ce qui pour moi montre comment les API de niveau 7 n'est pas nécessairement en vaut la considérant comme une cible. Dans le 8+ mise en page utiliser la nouvelle carte système.

Comme pour l'actionbar, nous sommes le portage d'une application dès maintenant et avoir facilement et correctement ajouté une carte pour un ViewPager, en créant le Fragment programtically (plutôt qu'en XML). Nous l'avons testé sur plusieurs appareils.

Nous avons également eu aucun problèmes à l'aide de la nouvelle carte système comme décrit dans Google démos avec l'ABS. Nous avons déclaré le fragment XML de mise en page et de définir ce que le contenu de l'activité. L'ActionBar affiche comme d'habitude. L'Activité est une SherlockFragmentActivity.

3voto

Pavlos Points 1215

En gros ce dont je suis sûr, c'est que cette SupportMapFragment est totalement nouveau et peut-être le responsable de ActionBarSherlock n'ai pas encore le temps de l'ajouter sur le Projet APA.

Aussi, il exige de l'API Lvl 8+ de sorte que vous pouvez simplement supprimer votre soutien à l'API lvl 7 appareils ou vous aurez à attendre pour Jake pour ajouter le support pour le nouveau SupportMapFragment.

Pour d'autres API lvls vous pouvez trouver un travail ici:http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

3voto

Vipul Shah Points 13233

J'ai essayé d'implémenter SupportMapFragment avec ActionBarSherlock.

Cela fonctionne très bien.

entrez la description de l'image ici

Ci-dessous, un extrait de code.

 package com.example.newmapview;

import android.os.Bundle;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.SubMenu;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MainActivity extends SherlockFragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SupportMapFragment fragment = SupportMapFragment.newInstance();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.mapLayout, fragment).commit();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu subMenu = menu.addSubMenu("Type");

        subMenu.add("Normal");
        subMenu.add("SATELLITE");

        subMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getTitle().toString().equalsIgnoreCase("Normal")) {
            Toast.makeText(this, "Clicked Normal", Toast.LENGTH_LONG).show();
            GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.mapLayout)).getMap();

            if (googleMap != null)
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            else
                Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG)
                        .show();
        } else if (item.getTitle().toString().equalsIgnoreCase("SATELLITE")) {
            Toast.makeText(this, "Clicked SATELLITE", Toast.LENGTH_LONG).show();
            GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.mapLayout)).getMap();

            if (googleMap != null)
                googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
            else
                Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG)
                        .show();
        }

        return true;

    }
}
 

J'espère que cela vous aidera.

0voto

unmultimedio Points 380

Je ne peux pas encore commenter partout, c'est pourquoi je réponds à @sureshcheemalamudi Si vous essayez de l'implémenter sur un fragment ou SherlockFragment, jetez un œil à ceci: http://stackoverflow.com/a/17803561/1755300

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X