从 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
我想在我的 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