(Tenga en cuenta que he añadido una mejor respuesta más abajo, más allá de la línea. Me voy de este top una en caso de necesidades que se ajuste mejor a alguien más.)
Sí, he estado tratando con el mismo problema. Tengo una solución algo torpe. Noté que puedes rotar casi cualquier Vista con setRotate. Desafortunadamente, esto solo gira su imagen, o algo así, y no se ocupa completamente de los problemas o la ubicación o el tamaño o la alineación. Aun así, he logrado improvisar algo que lo compense, aunque solo esté medio hecho (no funciona bien si giras a orientación vertical). Se llama a los siguientes siempre que se gira la tableta o se reorganiza el diseño o lo que sea.
private LinearLayout llMain;
private LinearLayout ll1;
private LinearLayout mainView;
private TabHost myTabHost;
public void setStuff() {
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (display.getOrientation() == 0 || display.getOrientation() == 2) {
ViewGroup.LayoutParams lp = myTabHost.getLayoutParams();
int top = 0;
int left = 0;
int height = 696;
int width = 1280;
int centerx = (width/2) + left;
int centery = (height/2) + top;
lp.height = width;
lp.width = height;
myTabHost.setLayoutParams(lp);
myTabHost.setTranslationX(centerx - (height/2));
myTabHost.setTranslationY(centery - (width/2));
lp = mainView.getLayoutParams();
lp.width = 1280;
lp.height = 696;
mainView.setLayoutParams(lp);
lp = llMain.getLayoutParams();
lp.width = 1280;
lp.height = 696;
llMain.setLayoutParams(lp);
ll1.setRotation(-90);
lp = ll1.getLayoutParams();
lp.height = 696;
lp.width = 1141;
ll1.setLayoutParams(lp);
left = 0;
top = 0;
height = 696;
width = 1141;
centerx = (width/2) + left;
centery = (height/2) + top;
ll1.setTranslationX(centery - (width/2));
ll1.setTranslationY(centerx - (height/2));
//ll1.setTranslationX(tx);
//ll1.setTranslationY(ty);
} else {
ViewGroup.LayoutParams lp = myTabHost.getLayoutParams();
int top = 0;
int left = 0;
int height = 1280;
int width = 696;
int centerx = (width/2) + left;
int centery = (height/2) + top;
lp.height = width;
lp.width = height;
myTabHost.setLayoutParams(lp);
myTabHost.setTranslationX(centerx - (height/2));
myTabHost.setTranslationY(centery - (width/2));
lp = mainView.getLayoutParams();
lp.width = 696;
lp.height = 1280;
mainView.setLayoutParams(lp);
lp = llMain.getLayoutParams();
lp.width = 696;
lp.height = 1280;
llMain.setLayoutParams(lp);
ll1.setRotation(-90);
lp = ll1.getLayoutParams();
lp.height = 1141;
lp.width = 696;
ll1.setLayoutParams(lp);
left = 0;
top = 0;
height = 1141;
width = 696;
centerx = (width/2) + left;
centery = (height/2) + top;
ll1.setTranslationX(centery - (width/1));
ll1.setTranslationY(centerx - (height/1));
//ll1.setTranslationX(tx);
//ll1.setTranslationY(ty);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setStuff();
//setContentView(R.layout.main);
}
llMain contiene mainView contains myTabHost contains ll1; deberás haberlos asignado como tal en el código de inicialización. La idea es que el TabHost se gira en el sentido de las agujas del reloj, y sus dimensiones deben intercambiarse manualmente para que sus contenedores sepan que tiene un tamaño/forma diferente, de lo contrario los bordes se cortan. Además, algunos cálculos se realizan para que giren alrededor del punto correcto, o al menos terminen en el lugar correcto. Los resultados no siempre tuvieron sentido, así que simplemente cambié cosas hasta que funcionó, al menos en modo horizontal. El contenido del TabHost también se rota, por lo que hay un código que lo gira hacia atrás, al menos la primera pestaña, que es ll1. Otras pestañas necesitarían girarse de manera similar. Me equivoqué con esto por un tiempo, y puede haber algunas cosas que son innecesarias. Por ejemplo, la vista principal. Creo que no es necesario que esté allí. Ah, y si el TabHost está en un lugar diferente, los números deberán ajustarse de alguna manera. Buena suerte con eso. De todos modos, espero que esto ayude a alguien. Hombre, la GUI de Android es tan irritante ... desearía que lo arreglaran ...Debo admitir, sin embargo, que a pesar de todos los obstáculos y frustraciones, la rotación de cualquier componente es bastante genial. Solo desearía que todo lo demás funcionara como esperabas.
¡He descubierto cómo hacerlo correctamente! Las etiquetas permanecen horizontal, de manera que pueden ser o no ser una buena cosa, dependiendo de lo que quiera, pero de todos modos:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
<FrameLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" android:id="@android:id/tabcontent"></FrameLayout>
<ScrollView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fillViewport="true"
android:scrollbars="none">
<TabWidget android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:id="@android:id/tabs"></TabWidget>
</ScrollView>
</LinearLayout>
</TabHost>
</LinearLayout>
Este archivo XML define un tabhost vacío con las pestañas de la derecha. Solo agrega las pestañas en tu código; hay publicaciones para eso. Copie/modifique/haga lo que tenga que hacer para que se ajuste a sus necesidades. Además, como es genial, agregué una vista de desplazamiento alrededor del widget de pestañas, por lo que automáticamente permitirá el desplazamiento si tienes demasiadas pestañas. Deshazte de él si no lo quieres. Obtuve el desplazamiento en su mayoría desde http://java.dzone.com/articles/scrolling-tabs-android. ¡Hurra!
Es una verdadera lástima que TabActivty no pueda manejar pestañas en la parte inferior o en el lateral por sí mismo. No veo por qué esto no está incorporado. He localizado un informe de error en el rastreador de errores de Android, pero realmente no hay indicios de que esto funcione en el corto plazo. http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –