带有片段的Google地图和导航标签

时间:2018-02-12 12:48:41

标签: android android-fragments

我试图在标签导航中添加地图,但我遇到了一些问题。

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();
}

当用户点击另一个标签时,它正在工作,但如果在同一标签中点击我有相同的错误且应用程序崩溃。

最好的方法是什么以及我必须使用的方法是什么?

1 个答案:

答案 0 :(得分:0)

你可以做一件事,你可以通过检查以下内容来避免点击同一个标签:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

因此它不会再次加载完整的片段。