2012-12-27 27 views
5

ボタンのクリックでフラグメントを切り替えるフラグメントアクティビティがあります。私は切り替え
二つの断片は、以下のとおりです。マップフラグメントから別のフラグメントへの切り替えフラグメントとバック

  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(); 

     } 
    } 
} 

これは私のマップ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"/> 

しかし、私は地図に戻っswichたびは、アプリケーションのクラッシュを断片化。このコードをどうすればいいですか?

答えて

0

FragmentManager Nullを作成しています。 fm=nullを削除してください。また、elseループでは、2つのフラグメントを置き換えています。一度に二重の交換をしないでください。 commit()を呼び出す前に、置換するのは1つだけです

+0

これらは同じレイアウトに置き換えられます。R.id.lay_contaier –

+0

@nagaraj - 投稿を編集しましたが、まだ同じアプリが貼り付けられたコードにはまだ – zoram

+0

がクラッシュします。間違いはありません。あなたは間違って見つけるために他のコードを表示する必要があります – TNR

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

私はmMapFragment.getMap()はnullを返したことがわかったので、あなたは残りのスケジュールを設定する必要があります理由です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> 

+1

これは、Google Playサービス6.5以降で、マップの初期化時に 'mMapFragment.getMapAsync()'メソッドを使用することにより、これを達成するためにはかなり古くなった方法です。 – Thorinside

関連する問題