9

google maps v2 androidが初めてロードされ、クラッシュするマップフラグメントに戻ったときに機能する他のフラグメントに切り替えています。以下のコードを添付しました。

fragmentMain のマップのコード:

public class FragmentMain extends Fragment {
    TextView textView;

    static final LatLng HAMBURG = new LatLng(53.558, 9.927);
    static final LatLng test = new LatLng(53.551, 9.993);
    private GoogleMap map;

    public FragmentMain() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, null);
        map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

                Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG)
                    .title("Hamburg"));

                Marker test = map.addMarker(new MarkerOptions()
                    .position(test)
                    .title("test")
                    .snippet("test")
                    .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.ic_launcher)));

                // Move the camera instantly to hamburg with a zoom of 15.
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));

                // Zoom in, animating the camera.
                map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

        return view;
    }
}

MainActivity のコード:

  FragmentManager fm = MainActivity.this.getSupportFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    Fragment fragment = null;


                    if(selectedItem.compareTo("second") == 0) {
                        fragment = new FragmentMain();
                    } else if(selectedItem.compareTo("third") == 0) {
                        fragment = new FragmentButton();
                    } else if(selectedItem.compareTo("first") == 0) {
                        fragment = new FragmentCheckBox();
                    } 


                    if(fragment != null) {
                        // Replace current fragment by this new one
                        ft.replace(R.id.activity_main_content_fragment, fragment);


                        ft.commit();
                        // Set title accordingly
                        tvTitle.setText(selectedItem);
                    }

エラー:

 FATAL EXCEPTION: main
 android.view.InflateException: Binary XML file line #83: Error inflating class fragment
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.mapsfragment.maps.FragmentMain.onCreateView(FragmentMain.java:32)
4

6 に答える 6

11

このコードを OnDestroyView() に置くだけです

public void onDestroyView() 
 {
    super.onDestroyView(); 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
}
于 2013-11-02T10:41:00.113 に答える
4

私の場合、同じアクティビティに異なるフラグメントがあったため、このコードを onPause() に入れました。

@Override
public void onPause() {
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
    super.onPause();
}
于 2014-04-02T10:35:21.380 に答える
2

同じ問題が発生しましたが、この後、パブリック静的ビューを使用してクラスを作成し(パブリック静的フラグも使用して)修正しました...そしてフラグメント内に、次のコードを配置します。

    View view;
    if(Global.flag==0){ 
           view = inflater.inflate(R.layout.fragment_main, null);
           Global.v = view;
           Global.flag=1;
    }
    else{
       view = Global.v;
   }

ps: グローバルは、これらの静的変数を持つパブリック クラスです。このようにして、一度だけ膨張させ、別の時間に復元できるように状態を保存します。

これが良い実践であるかどうかはわかりませんが、問題は解決しました。

私のひどい文法をおねがいします。

于 2013-11-11T00:35:49.603 に答える
2

私はそのようなことをしました

v を表示します。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    if (v != null) {
        ViewGroup parent = (ViewGroup) v.getParent();
        if (parent != null) {
            parent.removeView(v);
        }
    }

    try {
        v = inflater.inflate(R.layout.frag_admin_tab1, container, false);

        // Getting Map for the SupportMapFragment
        MapFragment mf = (MapFragment) this.getFragmentManager()
                .findFragmentById(R.id.google_map);
        GoogleMap map = mf.getMap();
        map.setMyLocationEnabled(true);
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        TextView tv = (TextView) v.findViewById(R.id.textView_Road);
        tv.setText("Road");

        LatLng pnts[] = new LatLng[4];

        pnts[0] = new LatLng(0, 0);
        pnts[1] = new LatLng(10, 0);
        pnts[2] = new LatLng(10, 10);
        pnts[3] = new LatLng(0, 10);

        PolygonOptions poly = new PolygonOptions().add(pnts)
                .fillColor(Color.argb(100, 255, 50, 50))
                .strokeColor(Color.GRAY).strokeWidth(0.5f);
        map.addPolygon(poly);
    } catch (InflateException e) {
    }

    v.setBackgroundColor(Color.WHITE);

    return v;
}
于 2013-11-16T08:46:58.667 に答える