我正在寻找使用ActionbarSherlock,但有一个查询阻止我。
因此,我的应用程序需要完全向后兼容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;
}
}
答案 0 :(得分:61)
这一切都像魅力一样,主要得益于杰克在ActionBarSherlock上的出色工作
以下是我遵循的步骤:
setHasOptionsMenu(true)
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;
}
}
答案 1 :(得分:4)
我听说杰克不会对ABS做太多,因为谷歌可能会推出他们自己的向后兼容的ActionBar。我想如果我没记错的话就会在Android相关的Google+环聊中进行讨论。
新地图需要API级别8以上,所以在担心操作栏之前,如果必须支持API级别7,则会遇到问题。
我的建议是生成2个布局文件,一个用于7级,1个用于8+。在第7级中使用现在的旧版MapView,尽管他们正在弃用它,这对我来说显示了API级别7不一定值得考虑作为目标。在8+布局中使用新的地图系统。
至于动作栏,我们现在正在移植一个应用程序,并通过程序化(而不是XML)创建Fragment,轻松成功地将地图添加到ViewPager。我们已在多台设备上测试过它。
我们使用新的地图系统也没有问题,如使用ABS的Google演示中所描述的那样。我们在XML布局中声明了片段,并将其设置为活动的内容。 ActionBar正常显示。活动是SherlockFragmentActivity。
答案 2 :(得分:3)
基本上我确信这个SupportMapFragment是全新的,也许ActionBarSherlock的维护者还没有时间将它添加到ABS项目中。
此外,它还需要API Lvl 8+,因此您可以删除对API lvl 7设备的支持,或者您必须等待Jake添加对新SupportMapFragment的支持。
对于其他API lvl,您可以在这里找到解决方法:http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/
答案 3 :(得分:3)
我尝试使用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;
}
}
希望这会有所帮助。
答案 4 :(得分:0)
我无法在任何地方评论,这就是我回答@sureshcheemalamudi的原因 如果您尝试在Fragment或SherlockFragment上实现它,请看一下:https://stackoverflow.com/a/17803561/1755300
答案 5 :(得分:0)
@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);
}
}