从 activity 获取变量值并将其传递给片段 activity

Get value of variable from activity and pass it to fragment activity

我想在我的 Activity 中获取 mLocal 的值并将其传递给 Fragment class 上的 LatLng。

主要Activity

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            initLocationFetching(MainActivity.this);

        mapFragment = new MapFragment(MainActivity.this, this);
        manager = getSupportFragmentManager();
        manager.beginTransaction().replace(R.id.mainLayout, mapFragment).commit();
}
            @Override
        public void locationFetched(Location mLocal, Location oldLocation, String time, String locationProvider) {
        super.locationFetched(mLocal, oldLocation, time, locationProvider);
    > here mLocal
    }

地图碎片Class

 class MapFragment extends Fragment implements OnMapReadyCallback,
            GoogleApiClient.OnConnectionFailedListener {

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        LatLng origin = new LatLng(14.507328, 121.000905);

        mMap.addMarker(new MarkerOptions()
                .position(new LatLng(14.507577, 121.004456))
                .anchor(0.5f, 0.5f)
                .title("title")
                .snippet("snippet")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));

        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(value1, value2), 9.0f));

    }

以上,我希望它不是硬编码的。我想在 MainActivity 中获取 mLocal 的值并将其传递给 LatLng() MapFragment.

您可以在MapFragment中添加一个名为setLocation的方法,并在MainActivity中调用。

像这样:

地图片段

// Location mCurrentLoc = null;

public void setLocation(Location loc) {
    mCurrentLoc = loc;
    if (mMap != null) {
        //do fragment location stuff
    }
}

@Override
public void onMapReady(GoogleMap googleMap) {
    // all your above code

    if (mCurrentLocation != null) {
        // do fragment location stuff
    }
}

主要活动

mapFragment.setLocation(mLocal);

要将数据从 activity 传递到片段,您可以使用 Bundle 来放置您的变量并使用此 Bundle 设置片段的参数,或者您可以使用另一种方式(我不查看您的整个项目以确保它是更好的方法)EventBus

你有 MapFragment 的实例作为 mapFragment 对吗?

所以在MapFragment.class中创建一个public方法作为getCoordinates

    public void getCoordinates(double latitude, double longitude){
         this.latitude = latitude;
         this.longitude = longitude;
}

将 Activity 的坐标发送到如下片段

if(mapFragment instanceOf MapFragment){
 ((MapFragment)mapFragment).getCoordinates(latitude, longitude);

您可以在 activity 中获取一个 public 全局变量 Location 并创建它 getter-setter

<pre> </p> <pre><code> MainActivity extends Activity public Location mLocal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @Override public void locationFetched(Location mLocal, Location oldLocation, String time, String locationProvider) { super.locationFetched(mLocal, oldLocation, time, locationProvider); setMLocal(mLocal); } public String getMLocal() { return mLocal; } public void setMLocal(String mLocal) { this.mLocal= mLocal; }

然后你可以在片段中使用 getter 方法 <pre></p> <pre><code>public void onMapReady(GoogleMap googleMap) { mMap = googleMap; Location mLocal = ((MainActivity)getActivity).getMLocal(); //you can get your Location object and you can use it further //LatLng origin = new LatLng(14.507328, 121.000905); mMap.addMarker(new MarkerOptions() .position(new LatLng(14.507577, 121.004456)) .anchor(0.5f, 0.5f) .title("title") .snippet("snippet") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initLocationFetching(MainActivity.this);

    mapFragment = new MapFragment(MainActivity.this, this);
    manager = getSupportFragmentManager();
}
 @Override
    public void locationFetched(Location mLocal, Location oldLocation, String time, String locationProvider) {
    super.locationFetched(mLocal, oldLocation, time, locationProvider);
 //After initLocationFetching.
 Bundle bundle = new Bundle();
 bundle.putDouble("Lat",mLocal.getLatitude());
 bundle.putDouble("Long"mLocal.getLongitude());
 mapFragment.setArguments(bundle);
 manager.beginTransaction().replace(R.id.mainLayout, mapFragment).commit();
}



//In MapFragment
class MapFragment extends Fragment implements OnMapReadyCallback,
        GoogleApiClient.OnConnectionFailedListener {
double lati=0.0;
double longi=0.0;

@Override
public void onCreate(Bundle bundle){
lati=getArguments().getDouble("Lat");
longi=getArguments().getDouble("Long");
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    LatLng origin = new LatLng(lati,longi);

    mMap.addMarker(new MarkerOptions()
            .position(new LatLng(lati,longi))
            .anchor(0.5f, 0.5f)
            .title("title")
            .snippet("snippet")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_CYAN)));

    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(value1, value2), 9.0f));

}

您必须创建 activity 的实例,然后将其数据传递给片段[=​​14=]

在您的片段中,声明 MainActivity 的变量以获取它的上下文,从而能够在片段上使用它,并声明您要为其分配 MainActivity 中包含的值的变量并将值传递给 onAttach 方法。 onAttch 在片段首次附加到其上下文时调用。

private MainActivity mActivity;
private String mData;

现在在 onAttach 方法中,当片段粘附到它的主要容器时 activity。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    //Verify if mActivity is null and it is MainActivity context
    if (mActivity == null && context instanceof MainActivity) {
        mActivity = (MainActivity) getActivity();
        //Checking for a NPE       
        if(mActivity != null){
         mData = mActivity.MyMainActivityVariable;
       }
     }
   }

并且在onDetach方法中 片段不再附加到其 activity 时调用。

@Override
public void onDetach() {
    super.onDetach();
    mActivity = null;
    }

现在我们可以从 MainActivity 使用我们想要使用的变量。 这是在使用支持库片段 有关片段的更多信息,请访问 Fragment Android Developers