27

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

}

4

6 に答える 6

61

主に Jake の ActionBarSherlock に関する素晴らしい仕事のおかげで、すべてが魔法のように機能します。

私が従った手順は次のとおりです。

  1. actiobarsherlock ライブラリ プロジェクトに SherlockMapFragment クラスを作成します。のサポートも必要だったので、単に SherlockFragment のコピーを作成しました。setHasOptionsMenu(true)
  2. アクティビティは SherlockFragmentActivity を拡張します (通常どおり)
  3. フラグメントは、新しく作成された SherlockMapFragment を拡張します
  4. ActionBarSherlock には新しいgoogle-play-services_libライブラリが必要です
  5. プロジェクトには ActionBarSherlock ライブラリが必要です。google-play-services を再度含める必要も、Google API に対してビルドする必要もありません。
  6. Graham が言及したように、API 7 デバイスのサポートを中止する必要があります。<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

そして、より詳細な説明のコードを次に示します。

SherlockMapフラグメント

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;
    }
}
于 2012-12-05T16:13:52.580 に答える
4

Google が独自の下位互換性のある ActionBar を提供する可能性があるため、Jake は ABS に対してこれ以上のことをするつもりはないと聞いています私の記憶が正しければ、Android 関連の Google+ ハングアウトの 1 つで議論されたと思います。

新しいマップには API レベル 8 以降が必要なので、API レベル 7 をサポートする必要がある場合、アクションバーについて心配する前に問題が発生します。

私のアドバイスは、レベル 7 用と 8+ 用の 2 つのレイアウト ファイルを作成することです。レベル 7 では、古いMapViewを使用しますが、廃止されています。これは、API レベル 7 が必ずしもターゲットとして検討する価値がないことを示しています。8+ レイアウトでは、新しいマップ システムを使用します。

アクションバーに関しては、現在アプリを移植しており、Fragment を (XML ではなく) プログラムで作成することにより、 ViewPagerにマップを簡単かつ正常に追加しました。複数のデバイスでテストしました。

また、ABS を使用した Google のデモで説明されているように、新しいマップ システムを使用しても問題はありませんでした。XML レイアウトでフラグメントを宣言し、これをアクティビティのコンテンツとして設定しました。ActionBar は通常どおり表示されます。アクティビティは SherlockFragmentActivity です。

于 2012-12-05T11:47:47.140 に答える
3

基本的に私が確信しているのは、この SupportMapFragment はまったく新しいものであり、おそらく ActionBarSherlock のメンテナーには、ABS プロジェクトに追加する時間がなかったということです。

また、API レベル 8+ が必要なので、API レベル 7 デバイスへのサポートを削除するか、Jake が新しい SupportMapFragment のサポートを追加するのを待つ必要があります。

他の API レベルについては、 http ://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/ で回避策を見つけることができます。

于 2012-12-05T11:19:44.510 に答える
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;

    }
}

これが役立つことを願っています。

于 2012-12-05T12:09:49.907 に答える
0

まだどこにもコメントできないので、@sureshcheemalamudi に回答します。フラグメントまたは SherlockFragment に実装しようとしている場合は、https ://stackoverflow.com/a/17803561/1755300 をご覧ください。

于 2013-07-23T07:20:31.393 に答える