(行を過ぎて、より良い回答をさらに下に追加したことに注意してください。他の人のニーズにより適している場合に備えて、この一番上の回答を残しています。)
ええ、私は同じ問題を扱ってきました。私はやや不格好な解決策を持っています。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 ファイルは、右側にタブがある空のタブホストを定義します。コードにタブを追加するだけです。そのための投稿があります。ニーズに合わせて必要なものをコピー/変更/実行します。また、かっこいいので、tabwidget の周りにスクロール ビューを追加しました。これにより、タブが多すぎる場合に自動的にスクロールできるようになります。いらない場合は削除してください。主にhttp://java.dzone.com/articles/scrolling-tabs-androidからスクロールのものを入手しました。わーい!