(Обратите внимание, что я добавил лучший ответ ниже, за чертой. Я оставляю этот лучший ответ на тот случай, если он лучше соответствует чьим-либо потребностям.)
Да, я имел дело с той же проблемой. У меня есть несколько неуклюжее решение. Я заметил, что вы можете вращать практически любой вид с помощью setRotate. К сожалению, это только поворачивает его изображение, или что-то, и не полностью решает проблемы или размещение, размер или выравнивание. Несмотря на это, мне удалось собрать воедино что-то, что отчасти компенсирует это, хотя это только наполовину сделано (не совсем правильно, если повернуть в портретную ориентацию). Следующее вызывается всякий раз, когда планшет поворачивается или макет перестраивается или что-то в этом роде.
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 содержит mainView содержит myTabHost содержит ll1; вам нужно будет назначить их как таковые в коде инициализации. Идея заключается в том, что TabHost вращается по часовой стрелке, и его размеры нужно менять вручную, чтобы его контейнеры теперь знали, что это другой размер / форма, иначе края обрезаются. Кроме того, некоторые вычисления выполняются так, чтобы он вращался вокруг правильной точки или, по крайней мере, оказывался в нужном месте. Результаты не всегда имели смысл, поэтому я просто изменил материал, пока он не работал, по крайней мере, в ландшафтном режиме. Содержимое TabHost тоже поворачивается, так что там есть код, который поворачивает его обратно, по крайней мере, первая вкладка, которая будет ll1. Другие вкладки нужно будет повернуть назад аналогичным образом. Некоторое время я возился с этим, и могут быть некоторые вещи, которые не нужны. Например, mainView. Я думаю, что это не должно быть там. Да, и если TabHost находится в другом месте, цифры нужно будет как-то скорректировать. Удачи с этим. В любом случае, я надеюсь, что это кому-нибудь поможет. Чувак, Android GUI настолько обостряет ... Хотелось бы, чтобы они это исправили ... Я признаю, что несмотря на все препятствия и разочарования, вращение любого компонента - довольно круто. Я просто хотел бы, чтобы все остальное работало так, как вы ожидаете.
Эй, я только что понял, как заставить это сделать это правильно! Ярлыки остаются горизонтальными, так что это может или не может быть хорошей вещью, в зависимости от того, что вы хотите, но в любом случае:
<?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>
Этот XML-файл определяет пустой вкладку с вкладками справа. Просто добавьте вкладки в свой код; для этого есть сообщения. Скопируйте / измените / сделайте все, что вам нужно, чтобы он соответствовал вашим потребностям. Кроме того, поскольку это круто, я добавил вид прокрутки вокруг вкладки, поэтому он автоматически разрешит прокрутку, если у вас слишком много вкладок. Избавься от этого, если не хочешь. Есть свиток в основном из http://java.dzone.com/articles/scrolling-tabs-android. Ууу!