web-dev-qa-db-fra.com

Utilisation d'ActionBarSherlock avec le nouveau SupportMapFragment

Je cherche à utiliser ActionbarSherlock mais une requête me retient.

Donc, mon application doit être totalement compatible avec l’API Niveau 7.

Je dois implémenter la nouvelle version de Google Maps dans mon application et, pour ce faire, utiliser la classe SupportMapFragment.

** Ma question ** 

Est-il possible d'utiliser la classe SupportMapFragment à côté de ActionBarSherlock?

Merci d'avance

MODIFIER

J'ai téléchargé et jeté un coup d'œil à la bibliothèque. Les seuls changements que je peux voir dans la variable Fragments étendue sont très simples et identiques pour tous.

Pensez-vous que je pourrais ajouter un soutien 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;
}

}

27
StuStirling

Tout fonctionne comme un charme, principalement grâce au formidable travail de Jake sur ActionBarSherlock

Voici les étapes que j'ai suivies:

  1. Créez une classe SherlockMapFragment dans votre projet de bibliothèque actiobarsherlock. J'ai simplement fait une copie de SherlockFragment parce que j'avais également besoin de l'assistance pour setHasOptionsMenu(true)
  2. L'activité étend SherlockFragmentActivity (comme d'habitude)
  3. Le fragment étend le SherlockMapFragment nouvellement créé
  4. ActionBarSherlock requiert la nouvelle bibliothèque google-play-services_lib
  5. Votre projet nécessite la bibliothèque ActionBarSherlock. Il n'est pas nécessaire d'inclure à nouveau les services google-play, ni de créer contre Google API.
  6. Comme mentionné par Graham, vous devez abandonner le support des périphériques API 7: <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'agencement XML de l'activité:

<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;
    }
}
61
Mudar

J ai entendu que Jake ne ferait pas beaucoup plus pour ABS, car Google sortira peut-être son propre ActionBar rétrocompatible. Je pense que si je me souviens bien, cela a été discuté dans l’un des hangouts Google+ liés à Android.

Les nouvelles cartes nécessitent un niveau d’API de niveau 8 supérieur. Par conséquent, avant de vous préoccuper de la barre d’action, vous rencontrerez des problèmes si vous devez prendre en charge le niveau 7 de l’API.

Mon conseil serait de produire 2 fichiers de mise en page, un pour le niveau 7 et un pour le 8+. Dans le niveau 7, utilisez l'ancien MapView bien qu'ils le déconseillent, ce qui pour moi montre que le niveau 7 de l'API n'est pas nécessairement intéressant en tant que cible. Dans la disposition 8+, utilisez le nouveau système de carte.

En ce qui concerne la barre d’action, nous portons une application en ce moment et avons facilement et avec succès ajouté une carte à un ViewPager , en créant le fragment par programme (plutôt qu’en XML). Nous l'avons testé sur plusieurs appareils.

Nous n’avons également rencontré aucun problème lors de l’utilisation du nouveau système de cartographie, comme décrit dans les démonstrations Google avec ABS. Nous avons déclaré le fragment dans une mise en page XML et l'avons défini comme contenu de l'activité. La barre d'actions s'affiche normalement. L'activité est une SherlockFragmentActivity.

4
Graham Smith

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

Cela fonctionne très bien.

enter image description here

Ci-dessous l'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 aidera.

3
Vipul Shah

En gros, ce dont je suis sûr, c’est que ce SupportMapFragment est totalement nouveau et que le responsable d’ActionBarSherlock n’a pas encore eu le temps de l’ajouter au projet ABS. 

En outre, il nécessite une API de niveau 8+, vous pouvez donc simplement supprimer votre prise en charge des périphériques API de niveau 7 ou vous devrez attendre que Jake ajoute la prise en charge du nouveau SupportMapFragment.

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

3
Pavlos

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 sur SherlockFragment, regardez ceci: https://stackoverflow.com/a/17803561/1755300

0
unmultimedio
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle mapType
    if (mapFragment != null) {
        googleMap = mapFragment.getMap();
    }
    switch (item.getItemId()) {
    case R.id.action_normal:
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        Toast.makeText(getActivity(), "normal", Toast.LENGTH_LONG).show();
        return true;
    case R.id.action_satellite:
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        Toast.makeText(getActivity(), "satellite", Toast.LENGTH_LONG)
                .show();
        return true;
    case R.id.action_terrian:
        googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        Toast.makeText(getActivity(), "terian", Toast.LENGTH_LONG).show();
        return true;
    case R.id.action_hybrid:
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        Toast.makeText(getActivity(), "hybrid", Toast.LENGTH_LONG).show();
        return true;
    default:

        return super.onOptionsItemSelected(item);
    }
}
0
Rahul