5

ボタンのクリックでフラグメントを切り替えるフラグメント アクティビティがあります。
私が切り替える2つのフラグメントは次のとおりです。

  1. Google マップ android v2 フラグメント
  2. テキスト ビューを持つ別のフラグメント

これは、フラグメントを切り替える方法です。

public void onClick(View v) {
    FragmentManager fm = getSupportFragmentManager();
    if(tv.getText().toString().equalsIgnoreCase("Click ME!!")){
        tv.setText("MAP");
        if (fm != null) {
            if(map == null){    
                map = new Map();
            }
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.lay_contaier, map);
            ft.commit();

        }
    }
    else{
        tv.setText("Click ME!!");
        if (fm != null ){
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.lay_contaier,new empty());
            ft.commit();

        }
    }
}

これは私の Maps Fagment コードです

  public class Map extends Fragment implements OnMarkerClickListener,    OnInfoWindowClickListener, OnMarkerDragListener {

private static final LatLng PERTH = new LatLng(-31.952854, 115.857342);
private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);


  private GoogleMap mMap;

private Marker mPerth;
  private Marker mSydney;
  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_main,null);

        return view;
  }

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>


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

しかし、Map フラグメントに戻るたびに、アプリケーションがクラッシュします。このコードを正しくするにはどうすればよいですか?

4

2 に答える 2

6

XML レイアウト ファイルでマップ フラグメントが定義されているため、これが発生していると思われます。この方法でフラグメントを交換するには、次のようなコードでマップをインスタンス化する必要があります。

private void initializeMap() {

    mMapFragment = SupportMapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, mMapFragment, "map");
    fragmentTransaction.commit();

    handler.post(new Runnable() {
        @Override
        public void run() {
            mMap = mMapFragment.getMap();

            mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
                @Override
                public void onCameraChange(CameraPosition cameraPosition) {
                    // Do something here
                }
            });
        }
    });
}

null を返すことがわかったので、インスタンスmMapFragment.getMap()を介して残りのセットアップをスケジュールする必要があります。Handler私のレイアウト XML は次のようになります。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LauncherActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_container">

    <!-- The fragments will go here -->
</RelativeLayout>

<RelativeLayout
    android:layout_gravity="start"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:background="@color/drawer_background">
...
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>

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

于 2013-09-12T22:55:31.437 に答える