Фрагмент MapFragment не привязан к контекстной ошибке, которую я получаю при переключении на `MapFragment` на другие` Fragments` при использовании Navigation Drawer - PullRequest
1 голос
/ 18 июня 2019

Цель приложения в том, чтобы при выборе карты из навигационного ящика она открывалась, а при переключении с карты на другой фрагмент она (и здесь возникает ошибка) открывалась легко.

Итак, я создаю приложение, в котором блок навигации и карта Google являются основным фрагментом, поэтому я реализовал блок навигации с использованием этого учебного пособия, а затем кодировал фрагмент карты в этом. когда я переключаюсь с FirstFragment на SecondFragment, который включает в себя только текстовую разметку, я могу легко переключиться, но один раз, когда я вхожу в TestMapFragment, который включает мою карту, и когда я переключаюсь обратно с этого на FirstFragment или SecondFragment, возникает ошибка, что Fragment TestMapFragment не привязан к контексту ,

Я пытался реализовать другое решение от Stackoverflow, но оно не работает, и я застрял здесь.

public class TestMapFragment extends Fragment implements  OnMapReadyCallback {

SupportMapFragment mapFragment;

private GoogleMap mMap;
LatLng latLng;


List<TrackObject> trackObjectList= new ArrayList<>();

public static int i =0;



public TestMapFragment() {
    // Required empty public constructor
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.activity_maps, container, false);

    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mapFragment=(SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    makeNetworkRequest();

}

public void makeNetworkRequest(){

    ApiBuilder.getInstance().getLocation().enqueue(new Callback<List<TrackObject>>() {
        @Override
        public void onResponse(Call<List<TrackObject>> call, Response<List<TrackObject>> response) {
            trackObjectList = response.body();


            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    latLng = new LatLng(Double.parseDouble(trackObjectList.get(i).getLatitude())
                            , Double.parseDouble(trackObjectList.get(i).getLongitude()));
                    mMap.addMarker(new MarkerOptions().position(latLng)
                            .title("Here")
                            .icon(BitmapDescriptorFactory.fromBitmap(getSmallerSize(R.drawable.green_dot_th))));
                    mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13f));


                    i++;

                    if(i <trackObjectList.size()){
                        handler.postDelayed(this,1000);
                    }else{
                        Log.e("TAG", "run: nothing to be fetched");
                    }

                }
            },1000);
        }

        @Override
        public void onFailure(Call<List<TrackObject>> call, Throwable t) {
            Log.e("TAG", "onFailure: "+t.getLocalizedMessage());
        }
    });
}

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;
    // Add a marker in Sydney and move the camera
    latLng = new LatLng(0,0);
    //displayCurrentLocation();

}


private Bitmap getSmallerSize(int res) {
    int height = 30;
    int width =30;
    BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(res);

    Bitmap bitmap = bitmapDrawable.getBitmap();
    return Bitmap.createScaledBitmap(bitmap, width, height, false);
}
}


public class MainActivity extends AppCompatActivity {

private DrawerLayout mDrawer;
private Toolbar toolbar;
private NavigationView nvDrawer;

private ActionBarDrawerToggle drawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //The Main Fragment that is open when user start the app
    /*FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
    tx.add(R.id.flContent, new FirstFragment());
    tx.commit();
*/
   /* if(savedInstanceState==null) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .add(R.id.nav_first_fragment
                        , new FirstFragment())
                .commit();

    }
*/

    // Set a Toolbar to replace the ActionBar.
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Find our drawer view
    mDrawer = findViewById(R.id.drawer_layout);
    drawerToggle = setUpDrawerToggle();

    // Tie DrawerLayout events to the ActionBarToggle
    mDrawer.addDrawerListener(drawerToggle);

    // Find our drawer view
    nvDrawer = findViewById(R.id.nvView);

    setupDrawerContent(nvDrawer);

}

private ActionBarDrawerToggle setUpDrawerToggle(){

    return  new ActionBarDrawerToggle(this,mDrawer,toolbar,R.string.drawer_open,R.string.drawer_close);


}
private void setupDrawerContent(final NavigationView navigationView) {

/*
    navigationView.getMenu().getItem(0).setChecked(true);
    navigationView.setCheckedItem(R.id.nav_first_fragment);
*/


    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

            selectDrawerItem(menuItem);
            return true;
        }
    });
}

private void selectDrawerItem(MenuItem menuItem) {

    //create a new fragment and specify the fragment to show the based on nav item clicked

    //Fragment fragment = null;
    Fragment fragment;
    FragmentManager fragmentManager= getSupportFragmentManager();

    //Class fragmentClass;

    switch(menuItem.getItemId()) {
        case R.id.nav_first_fragment:
            //fragmentClass = FirstFragment.class;
            fragment = new FirstFragment();
            fragmentManager.beginTransaction().replace(R.id.flContent,fragment).commit();
            break;
        case R.id.nav_second_fragment:
            //fragmentClass = TestMapFragment.class;
            fragment = new SecondFragment();
            fragmentManager.beginTransaction().replace(R.id.flContent,fragment).commit();
            break;
        case R.id.nav_third_fragment:
            //fragmentClass = TestMapFragment.class;
            fragmentManager.beginTransaction().replace(R.id.flContent,new TestMapFragment()).commit();
            break;
    }



    /*try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    }
*/
    // Insert the fragment by replacing any existing fragment
    /*fragmentManager =  getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent,fragment).commit();
*/
    // Highlight the selected item has been done by NavigationView
    menuItem.setChecked(true);

    // Set action bar title
    setTitle(menuItem.getTitle());

    // Close the navigation drawer
    mDrawer.closeDrawers();


}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // The action bar home/up action should open or close the drawer.
    if (drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}


// `onPostCreate` called when activity start-up is complete after `onStart()`
// NOTE 1: Make sure to override the method with only a single `Bundle` argument
// Note 2: Make sure you implement the correct `onPostCreate(Bundle savedInstanceState)` method.
// There are 2 signatures and only `onPostCreate(Bundle state)` shows the hamburger icon.
@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    drawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggles
    drawerToggle.onConfigurationChanged(newConfig);
}

}
...