18

I have this code in a fragment

public class TestOne extends Fragment {

    View view = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);

      LayoutInflater inflater2 = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater2.inflate(R.layout.testone, null); 

        Toast.makeText(getActivity(), "Rotate fragment", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Toast.makeText(getActivity(), "onCreate Fragment", Toast.LENGTH_SHORT).show();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.testone, null); 

        Toast.makeText(getActivity(), "onCreateView fragment", Toast.LENGTH_SHORT).show();

        return view; 
    }

}

What I'm trying to do is that, when I rotate the phone, I don't want the methods to be executed again. But I want to call again the xml layout, to load the layout-land folder's xml.

This code does not give any error, just does not work and do not understand the reason ..

I'm really interested in doing it using onConfiguratonChanged

I appreciate any help.

Thanks and regards

Sergio76
  • 3,835
  • 16
  • 61
  • 88
  • the methods in your `FragmentActivity` – mihirjoshi Jun 14 '13 at 21:21
  • there are methods that should be in the fragment – Sergio76 Jun 15 '13 at 17:10
  • And why should it work? In the `onConfigurationChanged` you simply inflate a layout and assign it to one of the fields of the `Activity`. I would advise you to use `setRetainInstance(true)` instead of the `onConfigurationChanged` way. As a manual solution I guess you could always remove all views from `getView()` and reattach the newly inflated layout. – user Jun 26 '13 at 10:22
  • I've searched but can not find any example showing how to use setRetainInstance (true). It is advisable to use it? – Sergio76 Jun 26 '13 at 10:49
  • Please specifically describe how it fails. "just does not work" is not very clear. – Paul Burke Jun 30 '13 at 22:14
  • Instead of using `onConfigurationChanged` you would set `setRetainInstance()` in the `onCreate()` method of the `Fragment`. This way the fragment instance will be kept across a configuration change, but the lifecycle methods will still be called in a slightly different order (so you would need to make some changes to them). If you just want to keep some data from being recreated then use a non UI fragment with `setRetainInstance()` to keep the data and let the fragment above be recreated(getting the data from that non UI fragment). – user Jul 01 '13 at 07:06

1 Answers1

34

In onCreateView create FrameLayout - this is the container for you fragmenView. Then create your R.layout.testone and add it to frameLayout.

In onConfigurationChanged clear FrameLayout, create R.layout.testone again and add it to frameLayout.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{
    frameLayout = new FrameLayout(getActivity());
    LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.testone, null);
    frameLayout .addView(view);
    return frameLayout; 
}

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    frameLayout. removeAllViews();
    LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.testone, null);
    frameLayout .addView(view);
}

Now all will work as you want!

Nik
  • 7,114
  • 8
  • 51
  • 75