我试图在标签导航中添加地图,但我遇到了一些问题。
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.navigation_group:
return true;
case R.id.navigation_map:
selectedFragment = MapFragment.newInstance();
break;
case R.id.navigation_profile:
selectedFragment = ProfileFragment.newInstance();
break;
}
android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, selectedFragment);
transaction.commit();
return true;
}
};
这是我带有标签的导航逻辑,当我尝试使用MapFragment时,我没有找到一种方法从类中返回Fragment" MapFragment"替换" selectedFrament"。
MapFragment代码:
public static Fragment newInstance() {
MapFragment fragment = new MapFragment();
return fragment;
}
如果我从Fragment扩展而没有调用onMapReady,那么我尝试了另一种方法,我使用GoogleApiClient来调用onMapReady方法。
这是我的MapFragment类
public class MapFragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener
和onCreate方法。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mLastKnownLocation = savedInstanceState.getParcelable(KEY_LOCATION);
mCameraPosition = savedInstanceState.getParcelable(KEY_CAMERA_POSITION);
}
// Build the Play services client for use by the Fused Location Provider and the Places API.
// Use the addApi() method to request the Google Places API and the Fused Location Provider.
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.enableAutoManage(getActivity() /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addConnectionCallbacks(this)
.addApi(LocationServices.API)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.build();
mGoogleApiClient.connect();
// Construct a FusedLocationProviderClient.
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getActivity());
}
这给我带来了另一个问题,当用户点击同一个标签时我出现以下错误"已经管理了ID为0&#34的GoogleApiClient;因为我总是创建连接,为了避免这个问题,我试图在所有生命周期方法中关闭它...... onPause,onStop等。
@Override
public void onStop() {
super.onStop();
mGoogleApiClient.stopAutoManage(getActivity());
mGoogleApiClient.disconnect();
}
当用户点击另一个标签时,它正在工作,但如果在同一标签中点击我有相同的错误且应用程序崩溃。
最好的方法是什么以及我必须使用的方法是什么?
答案 0 :(得分:0)
你可以做一件事,你可以通过检查以下内容来避免点击同一个标签:
MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
// add your code here
}
因此它不会再次加载完整的片段。