2

主に、ドロップダウンメニューを備えたFragmentActivityを取得しました。そのメニューからアイテムを選択すると、Fragmentを拡張してマップ上の他のものを表示するたびにそれ自体を表示するプライベートクラスになります。問題は、マップを制御するフラグメント クラス:

GoogleMap map = ((MapFragment)getFragmentManager.findFragmentById(R.id.map)).getMap()

フラグメントをMapFragmentにキャストできないと言われているので、クラスのMapFragmentを拡張しようとしましたが、ドロップダウンメニュー内の項目を選択すると、コードの次のセクションを実行します:

Fragment fragment = new MyFragmentClass()();
Bundle args = new Bundle();
args.putInt(PlacesFinder.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();

私はフラグメントしか使用できないので、フラグメントクラス内で見つけることができず、ドロップダウンメニューのためにmapfragmentを拡張できない場合、フラグメント内でGoogleマップを使用するにはどうすればよいですか?

頭を上げてくれてありがとう:)

4

3 に答える 3

0

遅れて申し訳ありませんが、これは主な活動です:

public class MainActivity extends FragmentActivity implements
    ActionBar.OnNavigationListener , LocationListener{
    private String [] types;
    private ActionBar actionBar;

    public static GoogleMap map = null;
    public static boolean googlePlayOn = false;
    private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        types = getResources().getStringArray(R.array.values);
        googlePlayOn = isGooglePlay();
        actionBar = getActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

        // Set up the dropdown list navigation in the action bar.
        actionBar.setListNavigationCallbacks(
        // Specify a SpinnerAdapter to populate the dropdown list.
                new ArrayAdapter<String>(getActionBarThemedContextCompat(),android.R.layout.simple_list_item_1,android.R.id.text1, types), this);
    }

    /**
     * This function checks in the phone operating system that 
     * the phone got google play services
     * @return
     */
    private boolean isGooglePlay()
    {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if(status == ConnectionResult.SUCCESS)
            return true;
        else
            ((Dialog) GooglePlayServicesUtil.getErrorDialog(status, this, 10)).show();
        return false;
    }


    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private Context getActionBarThemedContextCompat() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return getActionBar().getThemedContext();
        } else {
            return this;
        }
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // Restore the previously serialized current dropdown position.
        if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
            getActionBar().setSelectedNavigationItem(
                    savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        // Serialize the current dropdown position.
        outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
                .getSelectedNavigationIndex());
    }


    @Override
    public boolean onNavigationItemSelected(int position, long id) {
        // When the given dropdown item is selected, show its contents in the
        // container view.
        if(position != PlacesFinder.currentTitle)
        {
            if(!PlacesFinder.created)
            {
                PlacesFinder.created = true;
                Bundle b = new Bundle();
                b.putInt(PlacesFinder.ARG_SECTION_NUMBER, position);
                Fragment fragment = new PlacesFinder();
                fragment.setArguments(b);
                getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
            }
            PlacesFinder.newTitleBeenChosenHandler.sendEmptyMessage(0);
        }
        return true;
    }



    /**
     * A dummy fragment representing a section of the app, but that simply
     * displays dummy text.
     */
    public static class PlacesFinder extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public static boolean created = false;
        public static final String ARG_SECTION_NUMBER = "section_number";
        public static Handler newTitleBeenChosenHandler;
        public static int currentTitle = 0;
        private Context context;
        public PlacesFinder() {
            this.context = getActivity();
            loadMapFragment();
        }
        private void loadMapFragment()
        {
            if(googlePlayOn)
            {
                if(map == null)
                    map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

            }
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.places_fragment, container , false);
        }


    }



    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

    }

}




This is the main xml file :
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:ignore="MergeRootFrame" />

これは mapfragment ファイルです:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.MapFragment"/>

コード行を実行したら map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

アプリが失敗し、null ポインターを取得したと表示され、その理由がわかりません...

于 2013-04-15T15:06:05.437 に答える
0

getSupportFragmentManager() を使用する必要があります。

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

FragmentActivity を使用しているので、これは機能するはずです。Fragmentを使用していますが、同じ問題に直面していますが、それはできません:(

于 2014-05-27T19:18:20.440 に答える
0

GoogleMapフラグメント内で使用できます。XML でフラグメントを作成するコードの一部だけを見ると、エラーがあります。このフラグメントが XML レイアウトの唯一の要素であると仮定すると、次のようになります。

<fragment xmlns:android="schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="match_parent"      
    android:layout_height="match_parent"  
    class="com.google.android.gms.maps.MapFragment"/>

android:name がある XML の最後の行が間違っています。アクティビティ内にマップを追加するコードは機能するはずです

GoogleMap map = ((MapFragment)getFragmentManager.findFragmentById(R.id.map)).getMap();

以下のこのコードを問題なく使用しました

mapFrag = ((SupportMapFragment) getFragmenManager().findFragmenById(R.id.map)).getMap();

唯一の違いは、(1) を使用していたことSupportMapFragmentです。GoogleMap(2) の外側を宣言しましたonCreate

フラグメントを適切なクラスにキャストできないという説明に基づいているように思えますが、これはフラグメント XML のエラーに問題があるか、適切なインポートを使用していないためです。を使用している場合は、インポートMapFragmentを使用していることを確認する必要があります(ないまたは単に)。MapFragmentSupportMapFragmentFragment

コードの最後の部分については、ドロップダウン メニューとの関係がわかりません。フラグメントに引数を渡しているように見えますか? 詳細を提供できる場合は、それについてもコメントします。

于 2013-04-15T14:00:11.513 に答える