如何防止Fragment中的MapView重复创建/重新加载?

4
我正在我的应用程序中使用导航栏,每次选择一个项目后它会加载一个片段。
我已经成功保存了具有相同文本字段和按钮的片段的状态,但是有一个片段会加载地图、添加标记、聚类并执行一个AsyncTask。
每次我转到另一个菜单项并返回时,它会重新加载所有内容,例如AsyncTask、Cluster、Markers。如何停止这个片段不再重新创建地图,并在它回来时保存状态:
更新1:我更新了代码,但问题仍然存在。
MainActivity:
public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    NavigationView navigationView = null;
    Toolbar toolbar = null;
    GoogleMap nMap;
    SparseArray<Fragment> myFragments;
    JSONArray jArray;
    private static final int ERROR_DIALOG_REQUEST = 9001;
    public static final int ID_OF_BEACH = 5;
    //initBeach test = new initBeach();
    //JSONArray jsonArray = test.ExcuteLoad();

    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    Fragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myFragments = new SparseArray<>();

        //setTitle("");
        setContentView(R.layout.activity_main);

        if (servicesOK()) {
            try {
                jArray = new LoadJson().execute().get();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            setContentView(R.layout.activity_main);
        }

        //Set the fragment initially
        FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, new MainFragment(jArray));
        fragmentTransaction.addToBackStack("1");
        fragmentTransaction.commit();

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //noinspection ConstantConditions
        getSupportActionBar().setDisplayShowTitleEnabled(false);


        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();


        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //How to change elements in the header programatically


        navigationView.setNavigationItemSelectedListener(this);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        navigationView.setItemIconTintList(null);

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        //noinspection SimplifiableIfStatement
        return super.onOptionsItemSelected(item);
    }


    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camara) {
            fragment = myFragments.get(1);
            // if fragment doesn't exist in myFragments, create one and add to it
            if (fragment == null) {
                fragment = new MainFragment(jArray);
                myFragments.put(1, fragment);
            }
            FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();


            // Handle the camera actionn

        } else if (id == R.id.nav_gallery) {
            //Set the fragment initially
            fragment = myFragments.get(2);
            // if fragment doesn't exist in myFragments, create one and add to it
            if (fragment == null) {
                fragment = new GalleryFragment();
                myFragments.put(2, fragment);
            }

            FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();


        } else if (id == R.id.nav_search) {
            //Set the fragment initially

            // Handle the camera action

        } else if (id == R.id.nav_manage) {

            // Handle the camera action

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    public boolean servicesOK() {

        int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        if (isAvailable == ConnectionResult.SUCCESS) {
            return true;
        } else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)) {
            Dialog dialog =
                    GooglePlayServicesUtil.getErrorDialog(isAvailable, this, ERROR_DIALOG_REQUEST);
            dialog.show();
        } else {
            Toast.makeText(this, "Can't connect to mapping service", Toast.LENGTH_SHORT).show();
        }

        return false;
    }


    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://com.compscitutorials.basigarcia.navigationdrawervideotutorial/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }

    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://com.compscitutorials.basigarcia.navigationdrawervideotutorial/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }


    //AsyincTask to load JSON
    public class LoadJson extends AsyncTask<String, Void, JSONArray> {
        String URLu = "SOME_JSON_URL";


        @Override
        protected JSONArray doInBackground(String... params) {

            try {
                URL url = new URL(URLu);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream stream = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
                String finalJson = buffer.toString();

                JSONObject jsonObject = new JSONObject(finalJson);
                JSONArray jsonArray = jsonObject.getJSONArray("marcadores");

                return jsonArray;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }

        }

        @Override
        protected void onPostExecute(JSONArray result) {
            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
          super.onPreExecute();
        }

    }
}

MainFragment:

public class MainFragment extends Fragment {
    GoogleMap nMap;
    MapView mapView;
    CameraUpdate update;
    JSONArray array;
    private ClusterManager<ItemCluster> mClusterManager;
    private void parseJSON(JSONArray array) {
        if (mapView != null) {
            nMap = mapView.getMap();
            nMap.getUiSettings().setMyLocationButtonEnabled(false);
            nMap.setMyLocationEnabled(true);
            nMap.getUiSettings().setZoomControlsEnabled(true);
            mClusterManager = new ClusterManager<>(this.getActivity(), nMap);
            nMap.setOnCameraChangeListener(mClusterManager);
            nMap.setInfoWindowAdapter(mClusterManager.getMarkerManager());
            nMap.setOnMarkerClickListener(mClusterManager);
        }

        try {
            //Loading LAT LOng of markers on map
            for (int i = 0; i < array.length(); i++) {
                JSONObject jsonObject = array.getJSONObject(i);
                String locality = jsonObject.getString("nombre");
                String vientos = jsonObject.getString("viento");
                int temp = jsonObject.getInt("temperatura");
                double lat = jsonObject.getDouble("lat");
                double lon = jsonObject.getDouble("lon");
                nMap = mapView.getMap();

                mClusterManager.setRenderer(new OwnIconRendered(getActivity().getApplicationContext(), nMap, mClusterManager));
                ItemCluster offsetItem = new ItemCluster(lat, lon, locality, vientos, temp);
                mClusterManager.addItem(offsetItem);
            }
            LatLng latLon = new LatLng(39.4666667, -0.3666667);
            update = CameraUpdateFactory.newLatLngZoom(latLon, 10);
            nMap.moveCamera(update);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @SuppressLint("ValidFragment")
    public MainFragment(JSONArray input) {
        array = input;
    }
    public MainFragment() {

    }



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

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        mapView = (MapView) rootView.findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);

        parseJSON(array);

        // Inflate the layout for this fragment
        setRetainInstance(true);
        return rootView;

    }

    class OwnIconRendered extends DefaultClusterRenderer<ItemCluster> {

        private final IconGenerator mClusterIconGenerator = new IconGenerator(getActivity().getApplicationContext());
        private final TextView mClusterImageView;
        private final ImageView mClusterViento;
        private int tempAvg = 0;
        private final Drawable TRANSPARENT_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);


        public OwnIconRendered(Context context, GoogleMap map,
                               ClusterManager<ItemCluster> clusterManager) {
            super(context, map, clusterManager);

            View clusterIcon = getActivity().getLayoutInflater().inflate(R.layout.info_windows, null);
            mClusterIconGenerator.setContentView(clusterIcon);
            mClusterImageView = (TextView) clusterIcon.findViewById(R.id.maxTmp);
            mClusterViento = (ImageView) clusterIcon.findViewById(R.id.viento);

        }

        @Override
        protected void onBeforeClusterItemRendered(ItemCluster item, MarkerOptions markerOptions) {
            markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marcador_playa));
            markerOptions.title(item.getTitle());
            super.onBeforeClusterItemRendered(item, markerOptions);
        }

        @Override
        protected void onBeforeClusterRendered(Cluster<ItemCluster> cluster, MarkerOptions markerOptions) {

            tempAvg = 0;
            String vientoStr = null;
            for (ItemCluster item : cluster.getItems()) {
                tempAvg = (item.getTemp()+tempAvg);
            }

            mClusterImageView.setText(String.valueOf(tempAvg/cluster.getSize()));
            if ((tempAvg/cluster.getSize()) > 32) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_32_o_mas);
            } else if ((tempAvg/cluster.getSize()) <= 31 && (tempAvg/cluster.getSize()) >= 25) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_25_a_31);
            } else if ((tempAvg/cluster.getSize()) <= 24 && (tempAvg/cluster.getSize()) >= 20) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_20_a_24);
            } else if ((tempAvg/cluster.getSize()) <= 19 && (tempAvg/cluster.getSize()) >= 15) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_15_a_19);
            } else if ((tempAvg/cluster.getSize()) <= 14 && (tempAvg/cluster.getSize()) >= 10) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_10_a_14);
            } else if ((tempAvg/cluster.getSize()) <= 9 && (tempAvg/cluster.getSize()) >= 5) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_5_a_9);
            } else if ((tempAvg/cluster.getSize()) <= 4) {
                mClusterImageView.setBackgroundResource(R.drawable.temp_4_o_menos);
            }

            for (ItemCluster item : cluster.getItems()) {
                vientoStr = item.getViento();
                if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NE2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_ne2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NW2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_nw2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_E2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_e2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NE1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_ne1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NE3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_ne3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NE4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_ne4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NW1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_nw1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NW3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_nw3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_NW4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_nw4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_E1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_e1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_E3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_e3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_E4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_e4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_N1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_n1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_N2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_n2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_N3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_n3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_N4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_n4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_W1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_w1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_W2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_w2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_W3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_w3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_W4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_w4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SW1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_sw1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SW2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_sw2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SW3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_sw3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SW4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_sw4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SE1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_se1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SE2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_se2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SE3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_se3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_SE4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_se4);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_S1.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_s1);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_S2.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_s2);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_S3.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_s3);
                } else if (Objects.equals(vientoStr, "appvalenciaplayas/static/images/viento/viento_S4.svg")) {
                    mClusterViento.setImageResource(R.drawable.viento_s4);
                }
                break;
            }


            mClusterIconGenerator.setBackground(TRANSPARENT_DRAWABLE);
            Bitmap bitmap = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
            markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
        }


        @Override
        protected boolean shouldRenderAsCluster(Cluster cluster) {
            // Always render clusters.
            return cluster.getSize() > 1;
        }
    }


    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}

不要替换地图片段,你可以在其上添加新的片段。这样地图仍然存在,但被新片段遮盖隐藏了。 - apmartin1991
当我使用“添加”而不是“替换”时,我的应用程序在我打开一个片段并再次返回到该片段后崩溃。 - Blacksword
com.compscitutorials.basigarcia.navigationdrawervideotutorial E/AndroidRuntime: 致命异常: 主要 进程: com.compscitutorials.basigarcia.navigationdrawervideotutorial, java.lang.IllegalStateException: 片段已添加:MainFragment{78750c1 #2 id=0x7f0e008c} android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1361) android.support.v4.app.BackStackRecord.run(BackStackRecord.java:734) android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536) - Blacksword
1
@apmartin1991,您能否用一个回答将其讲清楚? - Blacksword
你解决了这个问题吗? - Mahdi
显示剩余2条评论
2个回答

0
您正在替换每个事件后的片段,请将该片段添加到后退栈中,然后从后退栈中弹出它。然后它就可以正常工作了。请检查下面的代码:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(android.R.id.content, testFragment);
fragmentTransaction.addToBackStack(TAG);
fragmentTranscation.commit();

这似乎不对,因为当你使用beginTransaction();时,你应该commit()它,对吧?那我应该在哪里弹出它呢? - Blacksword
然后检查FragmentManager fragmentManager = getFragmentManager(); fragmentManager.getBackStackEntryCount()并弹出堆栈。 - Manoj Perumarath
1
请更新代码并展示如何从堆栈中弹出它,正如您在我的代码中所看到的,我没有使用FragmentManager来处理这个。 - Blacksword

0

Google Maps' Docs说:

使用此类的用户必须将包含此视图的ActivityFragment中的所有生命周期方法转发到此类中的相应方法。特别是,您必须转发以下方法:

  • onCreate(Bundle)
  • onResume()
  • onPause()
  • onDestroy()
  • onSaveInstanceState()
  • onLowMemory()

因此,在您的MainFragment.java文件中,您必须覆盖上述所有方法并将调用委托给mapView

为了清晰起见,您可以像这样覆盖onSaveInstanceState()

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

编辑

另一个问题是您第一次创建MainFragment时没有对其进行缓存。这意味着当您从抽屉中带回一个实例时,您不会“重复使用”此实例(您可以通过按以下顺序单击抽屉项进行检查nav_gallery -> nav_camera -> nav_gallery -> nav_camera。第4个位置的MainFragment不应像第2个位置的那样加载):

Fragment fragment = new MainFragment(jArray);
myFragments.put(1, fragment);

//Set the fragment initially
FragmentTransaction fragmentTransaction =
        getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.addToBackStack("1");
fragmentTransaction.commit();

编辑2

为了维护片段的状态,您需要执行以下操作:

  1. 更新您的onSaveInstanceState(),以保存其状态,如下所示:

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
        outState.putString("jsonArr", jsonArray.toString());
        // TODO put more things which you need to.
    }
    
  2. 更新您的onCreateView(),以恢复状态,如下所示:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            String jsonArrString = savedInstanceState.getString("jsonArr");
            try {
                jsonArray = new JSONArray(jsonArrString);
            }
            catch (Exception e) {
                e.printStackTrace()
            }
        }
        // TODO your old code goes after this line.
    }
    

@AryaR,这可能会引起麻烦。请在您的Fragment的onCreate()中调用mapView.onCreate()。并且请更新代码。没有查看代码就无法提供太多建议。 - Sufian
我更新了代码,当我创建覆盖方法onCreate并将:mapView.onCreate()放在那里时,应用程序崩溃。 - Blacksword
  1. mapView.onCreate(savedInstanceState); 移动到 Fragment 的 onCreate() 中。
  2. 如果仍然发生崩溃,请发布您的 LogCat + 重现步骤。
- Sufian
那么?如果你看一下代码,它就是这样的。 - Blacksword
@AryaR,可能是因为你在两个地方都使用了new MainFragment()。它应该总是从myFragments中选择(并执行if语句)。你的流程是什么?即使在你从菜单中选择了“nav_camera”之后,它还是会发生吗? - Sufian
显示剩余25条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接