What I ended up doing was adjusting the layout to handle both landscape and portrait with empty containers that would later be filled with the proper fragment:
<RelativeLayout>
...
<FrameLayout
android:id="@+id/xmpRightContainer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true" >
</FrameLayout>
<FrameLayout
android:id="@+id/xmpBottomContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
</FrameLayout>
</RelativeLayout>
In onConfigurationChanged:
if (xmpFrag != null)
{
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(getSupportFragmentManager().findFragmentByTag(XmpFragment.FRAGMENT_TAG));
ft.commit();
fm.executePendingTransactions();
}
xmpFrag = new XmpFragment();
int container;
boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
if (isPortrait)
{
container = R.id.xmpBottomContainer;
}
else
{
container = R.id.xmpRightContainer;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(container, xmpFrag, XmpFragment.FRAGMENT_TAG);
ft.commit();
fm.executePendingTransactions();
This works perfectly and rotating the device is seamless to the user now.