将变量传递给已创建的片段&重新加载

时间:2015-07-20 14:14:01

标签: java android android-fragments

我有一个关于从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");

    }

}

2 个答案:

答案 0 :(得分:1)

将变量保存在Fragment类中,如下例所示。另请注意我如何在latitude中创建变量longitudeonCreateView(),以简单地为其保存值。现在,您可以随时在片段内访问它们。

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