Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change Fragment layout on orientation change

I have the following problem:

I have a TabActivity that shows a FragmentActivity in one of its tabs.

That FragmentActivity adds a ListFragment, when clicked on the item of that ListFragment, a Fragment is added (also to the backstack) and displayed.

Now I need to change the layout of that Fragment to change when going to landscape orientation.

But I'm totally clueless where to implement that change. I have already created to correct layout in the layout-land folder. But where is the correct point to set it?

like image 284
Goddchen Avatar asked Sep 16 '11 09:09

Goddchen


Video Answer


1 Answers

Warning: this may be a pre-Lollipop answer.

A Fragment doesn't get re-inflated on configuration change, but you can achieve the effect as follows by creating it with a FrameLayout and (re)populating that manually:

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
        FrameLayout frameLayout = new FrameLayout(getActivity());
        populateViewForOrientation(inflater, frameLayout);
        return frameLayout;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        populateViewForOrientation(inflater, (ViewGroup) getView());
    }

    private void populateViewForOrientation(LayoutInflater inflater, ViewGroup viewGroup) {
        viewGroup.removeAllViewsInLayout();
        View subview = inflater.inflate(R.layout.my_fragment, viewGroup);

        // Find your buttons in subview, set up onclicks, set up callbacks to your parent fragment or activity here.
    }
}

I'm not particularly happy with the getActivity() and related calls here, but I don't think there's another way to get hold of those things.

Update: Removed cast of ViewGroup to FrameLayout and used LayoutInflater.from(), and the third parameter of inflate() instead of adding the view explicitly.

like image 140
android.weasel Avatar answered Oct 14 '22 19:10

android.weasel