Цель приложения в том, чтобы при выборе карты из навигационного ящика она открывалась, а при переключении с карты на другой фрагмент она (и здесь возникает ошибка) открывалась легко.
Итак, я создаю приложение, в котором блок навигации и карта 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);
}
}