我有一个关于从MainActivity向我的Fragment传递变量的问题。
在我的MainActivity中,我有一个按钮,它创建并显示一个片段,分别重新加载它(如果它已经创建)。 (I am using this code to reload the fragment)
我通过Bundle
- 类传递2个双变量。这在我第一次创建片段时有效,但是当我想重新加载片段时,如何更新变量?在我的代码中,我不是创建一个新的片段,而是分离并重新附加它。这可能与我的方法有关,还是我需要完全不同的东西?
MainActivity
public void loadWeatherFragment(){
longitude = this.getLongitude();
latitude = this.getLatitude();
FragmentManager fm = getFragmentManager();
Fragment currentFragment = this.getFragmentManager().findFragmentById(R.id.fragment_container);
//If the fragment already exists, reload it
if (currentFragment instanceof FragmentWeather) {
FragmentTransaction fragTransaction = this.getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();
}
//Else create the fragment
else{
FragmentWeather mFragmentWeather = new FragmentWeather();
Bundle args = new Bundle();
args.putDouble("longitude", longitude);
args.putDouble("latitude", latitude);
mFragmentWeather.setArguments(args);
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_container, mFragmentWeather);
ft.commit();
}
}
FragmentWeather
public class FragmentWeather extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_weather, container, false);
Double latitude = this.getArguments().getDouble("latitude");
Double longitude = this.getArguments().getDouble("longitude");
}
}
答案 0 :(得分:1)
将变量保存在Fragment
类中,如下例所示。另请注意我如何在latitude
中创建变量longitude
和onCreateView()
,以简单地为其保存值。现在,您可以随时在片段内访问它们。
public class FragmentWeather扩展Fragment {
private Double latitude;
private Double longitude;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_weather, container, false);
latitude = this.getArguments().getDouble("latitude");
longitude = this.getArguments().getDouble("longitude");
}
}
如果您需要从其他类更新这些变量,请为变量创建getter和setter(许多IDE也可以为您执行此操作,在Windows Android Studio中,Alt + Insert是热键)。然后,只要班级可以看到您的Fragment
,它也可以访问这些变量。定义
public Double getLongitude()
{
return this.longitude;
}
public void setLongitude(double val)
{
this.longitude = val;
}
并使用它们
FragmentWeather fragment = new FragmentWeather();
double longitude = 0.0;
fragment.setLongitude(longitude);
double latitude = fragment.getLatitude();
答案 1 :(得分:0)
有什么理由,为什么片段必须被卸载然后重新播出?
最简单的解决方案是为片段提供一个可以从活动中调用的公共API:
public class FragmentWeather extends Fragment {
//...
// public api to be used by owning activity
public setLatLon(double latitude, double longitude) {
// do what is neccessary to show lat/lon
}
}
public class MainActivity ... {
public void loadWeatherFragment(){
Fragment currentFragment = this.getFragmentManager().findFragmentById(R.id.fragment_container);
//If the fragment already exists, reload it
if (currentFragment instanceof FragmentWeather) {
((FragmentWeather) currentFragment).setLatLon(...)
}
}
}