Подтвердить что ты не робот

Использование ActionBarSherlock с новой поддержкой SupportMapFragment

Я использую 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;
}

}

4b9b3361

Ответ 1

Все это работает как шарм, главным образом благодаря Джейку большой работе над ActionBarSherlock

Ниже приведены шаги, которые я выполнил:

  • Создайте класс SherlockMapFragment в вашем проекте библиотеки actiobarsherlock. Я просто сделал копию SherlockFragment, потому что мне также нужна поддержка setHasOptionsMenu(true)
  • Действие распространяется на SherlockFragmentActivity (как обычно)
  • Фрагмент расширяет только что созданный файл SherlockMapFragment
  • Для ActionBarSherlock требуется новая библиотека google-play-services_lib
  • Для вашего проекта требуется библиотека ActionBarSherlock. Не нужно снова включать сервисы google-play или создавать против Google API.
  • Как упоминалось Graham, вам необходимо отказаться от поддержки устройств API 7: <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);
    }
}

Макет действий:

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

Ответ 2

Я слышал, что Джейк не собирается делать слишком много для ABS, поскольку Google может создавать свой собственный обратно совместимый ActionBar. Я думаю, что если я правильно помню, это обсуждалось в одной из Android-сообществ Google+.

Новые карты требуют уровня API 8, поэтому, прежде чем даже беспокоиться о панели действий, вы столкнетесь с проблемами, если вы должны поддерживать уровень API 7.

Мой совет будет производить 2 файла макета один для уровня 7 и один для 8+. На уровне 7 используйте теперь старые MapView, хотя они обесценивают его, что для меня показывает, как API-уровень 7 не обязательно стоит рассматривать как цель. В макете 8+ используйте новую систему карт.

Что касается панели действий, мы переносим приложение прямо сейчас и легко и успешно добавили карту в ViewPager, создав Фрагмент программно (а не в XML). Мы протестировали его на нескольких устройствах.

У нас также не было проблем с использованием новой системы карт, как описано в демоверсии Google с ABS. Мы объявили фрагмент в XML-макете и установили это как содержимое активности. ActionBar отображается как обычно. Активность - это функция SherlockFragmentActivity.

Ответ 3

В основном, я уверен, что этот SupportMapFragment полностью свежий, и, возможно, у поддерживающего ActionBarSherlock еще нет времени добавить его в проект ABS.

Также для этого требуется API Lvl 8+, поэтому вы можете просто удалить свою поддержку на устройствах API lvl 7 или вам придется ждать, пока Джейк добавит поддержку для нового SupportMapFragment.

Для других API lvls вы можете найти здесь работу: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

Ответ 4

Я попробовал реализовать SupportMapFragment с помощью ActionBarSherlock.

Он работает очень хорошо.

enter image description here

Ниже приведен фрагмент кода.

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;

    }
}

Надеюсь, это поможет.

Ответ 5

Я не могу прокомментировать всюду, почему я отвечаю @sureshcheemalamudi Если вы пытаетесь реализовать его на фрагменте или в файле SherlockFragment, посмотрите на это: fooobar.com/questions/193850/...

Ответ 6

@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);
    }
}