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;
}
}
Tout fonctionne comme un charme, principalement grâce au formidable travail de Jake sur ActionBarSherlock
Voici les étapes que j'ai suivies:
setHasOptionsMenu(true)
google-play-services_lib
<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;
}
}
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.
J'ai essayé d'implémenter SupportMapFragment avec ActionBarSherlock.
Cela fonctionne très bien.
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.
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/
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
@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);
}
}