(Beachten Sie, dass ich eine bessere Antwort weiter unten, vorbei an der Linie hinzugefügt. Ich bin falls es besser paßt jemand andere Bedürfnisse in diesem Top ein zu verlassen.)
Ja, ich habe mit dem beschäftigt gleicher Fehler. Ich habe eine etwas klobige Lösung. Ich habe festgestellt, dass Sie mit setRotate so ziemlich jede Ansicht drehen können. Leider rotiert dies nur sein Bild oder etwas und geht nicht vollständig auf Probleme oder Platzierung oder Größe oder Ausrichtung ein. Trotzdem habe ich es geschafft, etwas zusammenzubringen, das es irgendwie ausgleicht, obwohl es nur halb fertig ist (funktioniert nicht ganz richtig, wenn man in Hochformat dreht). Das Folgende wird aufgerufen, wenn das Tablet gedreht wird oder das Layout neu angeordnet wird oder was auch immer.
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 enthält mainView enthält myTabHost enthält ll1; Sie müssen sie im Initialisierungscode als solche zugewiesen haben. Die Idee ist, dass der TabHost im Uhrzeigersinn gedreht wird, und seine Abmessungen müssen manuell ausgetauscht werden, so dass seine Container wissen, dass es eine andere Größe/Form hat, jetzt, sonst werden die Kanten abgeschnitten. Außerdem werden einige Berechnungen durchgeführt, damit es um den richtigen Punkt rotiert wird oder zumindest an der richtigen Stelle endet. Die Ergebnisse haben nicht immer Sinn gemacht, also habe ich einfach das Zeug gewechselt, bis es funktionierte, zumindest im Querformat. Der Inhalt des TabHosts wird ebenfalls gedreht, also gibt es Code, der ihn zurückdreht, zumindest den ersten Tab, der 11 ist. Andere Registerkarten müssten ähnlich zurück gedreht werden. Ich habe eine Weile damit herumgespielt, und vielleicht gibt es einige Dinge, die unnötig sind. Zum Beispiel die Hauptansicht. Ich denke, das muss nicht da sein. Oh, und wenn der TabHost an einem anderen Ort ist, müssen die Zahlen irgendwie angepasst werden. Viel Glück damit. Jedenfalls hoffe ich, dass das jemandem hilft. Mann, Android GUI ist so ärgerlich ... Ich wünschte, sie würden es reparieren ....Ich gebe jedoch zu, dass trotz aller Hindernisse und Frustrationen, ist die Rotation aller Komponenten ziemlich cool. Ich wünschte nur, alles andere würde so funktionieren, wie du es erwartest.
Hey, ich habe gerade herausgefunden, wie man es richtig macht! Die Etiketten bleiben horizontal, so dass kann oder auch nicht eine gute Sache sein, je nachdem, was Sie wollen, aber trotzdem:
<?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>
Diese XML-Datei definiert eine leere TabHost mit den Registerkarten auf der rechten Seite. Fügen Sie einfach die Tabs in Ihrem Code hinzu. Dafür gibt es Posts. Kopieren/ändern/tun, was immer Sie tun müssen, um es Ihren Bedürfnissen anzupassen. Außerdem, weil es cool ist, habe ich eine Scroll-Ansicht um das Tabwidget hinzugefügt, sodass es automatisch scrollen kann, wenn Sie zu viele Tabs haben. Werden Sie es los, wenn Sie es nicht wollen. Habe die Scroll-Sache meistens von http://java.dzone.com/articles/scrolling-tabs-android bekommen. Yay!
Es ist wirklich schade, dass TabActivty nicht mit Tabs auf der Unterseite oder auf der Seite umgehen kann. Ich sehe nicht, warum das nicht eingebaut ist. Ich habe einen Bug-Bericht auf dem Android-Bug-Tracker gefunden, aber es gibt wirklich keinen Hinweis, dass dies in absehbarer Zeit bearbeitet wird. http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –