java - 片段 MapFragment 未附加到使用导航抽屉时切换到“MapFragment”到其他“片段”时遇到的上下文错误
问题描述
应用程序的目标是,当我从导航抽屉中选择地图时,它应该打开,并且当从地图切换回另一个片段时,它应该(并且出现错误)轻松打开。
所以,我正在制作一个应用程序,它具有导航抽屉和谷歌地图作为主要片段,所以我使用本教程实现了导航抽屉,然后我在其中编写了地图片段。当我切换到仅包含文本布局的 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);
}
}
解决方案
推荐阅读
- bash - bash中的插入排序
- json - 如何在 JSON 序列化中添加括号?
- regex - PowerShell - 用于更改多值字段中的分隔符的正则表达式
- azure-application-insights - Visual Studio App Center - 按时间查找诊断日志
- bash - 如何访问用户主目录
- android - 安卓。活动不是从服务开始的
- linux - 使用 ansible playbook 修改 sshd_config 中的 AllowGroups
- java - java比较逗号分隔的字符串
- python - 欧拉计划问题 #1 - 没有得到正确的答案
- node.js - 单击基于 $eval 的 div 会引发 div click 不是 puppeteer 中的功能