私はActionbarSherlockの使用を検討していますが、それを妨げるクエリが1つあります。
したがって、私のアプリケーションはAPIレベル7と完全に下位互換性がある必要があります。
アプリケーションに新しいGoogleマップを実装する必要があります。そのためには、SupportMapFragmentクラスを使用する必要があります。
** 私の質問 **
SupportMapFragment
クラスをActionBarSherlock
と一緒に使用できますか?
事前に感謝
[〜#〜]編集[〜#〜]
ライブラリをダウンロードして確認しました。私が見ることができる拡張Fragments
への唯一の変更は非常に単純であり、それらすべてに同じです。
自分でサポートを追加できると思いますか?
これらはどのようにサポートされるかです。
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;
}
}
主にジェイクのActionBarSherlockに関する素晴らしい仕事のおかげで、それはすべて魅力のように機能します
ここに私が従ったステップがあります:
setHasOptionsMenu(true)
のサポートも必要だったので、SherlockFragmentのコピーを作成しました。google-play-services_lib
ライブラリが必要です<uses-sdk Android:minSdkVersion="8" Android:targetSdkVersion="17" />
そして、より詳細な説明のためのコードがあります:
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;
}
}
アクティビティ:
public class MainActivity extends SherlockFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
アクティビティ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>
マップフラグメント:
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;
}
}
私は聞いたGoogleが下位互換性のある独自のActionBarを提供している可能性があるため、JakeがABSに対してあまり多くのことをするつもりはないことを。私が正しく覚えていれば、Android関連するGoogle+ハングアウトの1つで議論されたと思います。
新しいマップにはAPIレベル8以降が必要なので、アクションバーを気にする前に、APIレベル7をサポートする必要がある場合に問題が発生します。
私のアドバイスは、レベル7用と8以上用の2つのレイアウトファイルを作成することです。レベル7では、古い MapView を使用しますが、廃止予定ですが、APIレベル7がターゲットとして検討する価値がないことを私は示しています。 8+レイアウトでは、新しいマップシステムを使用します。
アクションバーについては、現在アプリを移植しており、(XMLではなく)プログラムでFragmentを作成することにより、マップを ViewPager に簡単かつ正常に追加しています。複数のデバイスでテストしました。
ABSを使用したGoogleデモで説明されているように、新しい地図システムを使用しても問題は発生していません。フラグメントをXMLレイアウトで宣言し、これをアクティビティのコンテンツとして設定しました。 ActionBarは通常どおり表示されます。アクティビティはSherlockFragmentActivityです。
ActionBarSherlockでSupportMapFragmentを実装してみました。
それは非常にうまく機能しています。
以下はコードスニペットです。
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;
}
}
これがお役に立てば幸いです。
基本的に私が確信しているのは、このSupportMapFragmentが完全に新鮮であり、おそらくActionBarSherlockのメンテナがまだABSプロジェクトに追加する時間を持っていなかったということです。
また、API Lvl 8+が必要なため、API lvl 7デバイスへのサポートを削除するか、Jakeが新しいSupportMapFragmentのサポートを追加するのを待つ必要があります。
他のAPIレベルについては、ここで回避策を見つけることができます: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/
まだどこにもコメントできないので、@ sureshcheemalamudiと答えます。FragmentまたはSherlockFragmentに実装しようとしている場合は、これを見てください: https://stackoverflow.com/a/17803561/ 17553
@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);
}
}