Używanie ActionBarSherlock z nowym SupportMapFragment
Patrzę na używanie ActionbarSherlock, ale mam jedno zapytanie, które mnie powstrzymuje.
Więc moja aplikacja musi być w pełni wstecznie kompatybilna z API Level 7.
Muszę zaimplementować nowe mapy Google w mojej aplikacji i aby to zrobić, muszę skorzystać z klasy SupportMapFragment.
** Moje Pytanie * *
Czy możliwe jest użycie klasy SupportMapFragment
obok ActionBarSherlock
?
Z góry dzięki
EDIT
Pobrałem i zajrzałem do biblioteki. Jedyne zmiany w rozszerzonym Fragments
, jakie widzę, są bardzo proste i takie same dla wszystkich.
Oto jak są one obsługiwane.
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;
}
}
6 answers
To wszystko działa jak urok, głównie dzięki wspaniałej pracy Jake ' a nad ActionBarSherlock]}
Oto kroki, które wykonałem:
- Utwórz klasę SherlockMapFragment w projekcie biblioteki actiobarsherlock. Po prostu zrobiłem kopię SherlockFragment, ponieważ potrzebowałem również wsparcia dla
setHasOptionsMenu(true)
- aktywność rozszerza SherlockFragmentActivity (jak zwykle)
- fragment rozszerza nowo utworzony fragment SherlockMapFragment
- ActionBarSherlock wymaga nowego
google-play-services_lib
biblioteka - Twój projekt wymaga biblioteki ActionBarSherlock. Nie ma potrzeby ponownego włączania usług google-play lub budowania z Google API.
- jak wspomniał Graham, musisz zrezygnować z obsługi urządzeń API 7:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
A oto kod do bardziej szczegółowego wyjaśnienia:
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;
}
}
Aktywność:
public class MainActivity extends SherlockFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Układ activity XML:
<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>
Mapa fragment:
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;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 15:26:13
I słyszałem że Jake nie zrobi zbyt wiele więcej dla ABS, ponieważ Google może wydobywać swoje własne wstecznie kompatybilne ActionBar. Myślę, że jeśli dobrze pamiętam, to było omawiane w jednym z Android związane Google+ hangouts.
Nowe mapy wymagają API na poziomie 8, więc zanim zaczniesz się martwić o actionbar, napotkasz problemy, jeśli musisz obsługiwać API na poziomie 7.
Moją radą byłoby wyprodukowanie 2 plików układów, jeden dla poziomu 7 i jeden dla 8+. W level 7 używaj starego MapView, chociaż go dezaprobują, co dla mnie pokazuje, że API Level 7 niekoniecznie jest warte rozważenia jako cel. W układzie 8+ Użyj nowego systemu map.
Jeśli chodzi o actionbar, w tej chwili przenosimy aplikację i łatwo i skutecznie dodaliśmy mapę do ViewPager , tworząc fragment programowo (a nie w XML). Przetestowaliśmy go na wielu urządzeniach.
Nie mieliśmy też problemów z używaniem nowej mapy system opisany w Google demos z ABS. Zadeklarowaliśmy fragment w układzie XML i ustawiliśmy go jako zawartość działania. Pasek czynności jest wyświetlany normalnie. Działalność jest SherlockFragmentActivity.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 12:15:43
Zasadniczo jestem pewien, że ten SupportMapFragment jest całkowicie świeży i być może opiekun ActionBarSherlock nie miał jeszcze czasu, aby dodać go do projektu ABS.
Wymaga również API LVL 8+ , więc możesz po prostu usunąć wsparcie dla urządzeń API LVL 7 lub będziesz musiał poczekać, aż Jake doda wsparcie dla nowego SupportMapFragment.
Dla innych LVL API można znaleźć obejście here:http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 11:19:44
Próbowałem zaimplementować SupportMapFragment za pomocą ActionBarSherlock.
Działa bardzo dobrze.Poniżej fragment kodu.
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;
}
}
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 12:09:49
Nie mogę jeszcze skomentować wszystkiego, dlatego odpowiadam @sureshcheemalamudi Jeśli próbujesz zaimplementować go na fragmencie, lub SherlockFragment, spójrz na to: https://stackoverflow.com/a/17803561/1755300
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:32:11
@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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 12:59:32