(Si noti che ho aggiunto una risposta migliore, più in basso, oltre la linea. Sto lasciando questo top nel caso in cui meglio si adatta qualcun altro ha bisogno.)
Sì, ho avuto a che fare con la stesso problema. Ho una soluzione piuttosto goffo. Ho notato che puoi ruotare praticamente qualsiasi vista con setRotate. Sfortunatamente, questo ruota solo la sua immagine, o qualcosa del genere, e non si occupa completamente di problemi o collocazione o dimensione o allineamento. Anche così, sono riuscito a mettere insieme qualcosa che lo compensa, anche se è solo a metà (non funziona bene se si ruota in verticale). Il seguente viene chiamato ogni volta che il tablet viene ruotato o il layout viene riorganizzato o altro.
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 contiene myTabHost contiene ll1; è necessario averli assegnati come tali nel codice di inizializzazione. L'idea è che il TabHost venga ruotato in senso orario, e le sue dimensioni devono essere scambiate manualmente in modo che i contenitori sappiano che è di una dimensione/forma diversa, ora, altrimenti i bordi vengono tagliati. Inoltre, alcuni calcoli vengono eseguiti in modo che vengano ruotati attorno al punto giusto, o almeno finiscano nel posto giusto. I risultati non hanno sempre avuto senso, quindi ho solo cambiato le cose fino a quando non ha funzionato, almeno in modalità orizzontale. Anche il contenuto del TabHost viene ruotato, quindi c'è del codice lì dentro che lo ruota indietro, almeno la prima scheda, che è ll1. Altre schede dovrebbero essere ruotate allo stesso modo. Ho fatto un po 'di casino con questo, e potrebbero esserci alcune cose che non sono necessarie. Ad esempio, il mainView. Penso che non sia necessario essere lì. Oh, e se il TabHost è in un posto diverso, i numeri dovranno essere regolati in qualche modo. Buona fortuna. Ad ogni modo, spero che questo aiuti qualcuno. Uomo, la GUI di Android è così aggravante ... vorrei che lo aggiustassero ...Devo ammettere, tuttavia, che nonostante tutti gli ostacoli e le frustrazioni, la rotazione di qualsiasi componente è piuttosto interessante. Spero solo che tutto il resto funzioni come ti aspetteresti.
Ehi, ho appena capito come ottenerlo per farlo correttamente! Le etichette rimangono orizzontale, in modo che possono o non possono essere una buona cosa, a seconda di ciò che si vuole, ma in ogni caso:
<?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>
Questo file XML definisce un tabhost vuota con le linguette a destra. Basta aggiungere le schede nel codice; ci sono post in giro per quello. Copia/modifica/fai tutto ciò che devi fare per adattarlo alle tue esigenze. Inoltre, perché è bello, ho aggiunto una vista a scorrimento attorno al tabwidget, quindi lo scrollò automaticamente se hai troppe tabulazioni. Sbarazzati se non lo vuoi. Ho la cosa di scorrimento principalmente da http://java.dzone.com/articles/scrolling-tabs-android. Sìì!
È un vero peccato che TabActivty non possa gestire da solo le schede in basso o di lato. Non vedo perché questo non è integrato. Ho individuato un bug report sul bug tracker di Android, ma non c'è davvero alcuna indicazione che ciò possa essere risolto in qualsiasi momento a breve. http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –