5

私の雇用主は、非常に具体的な UI 要件を持つ Android アプリケーションの作業をさせています。具体的には、TabWidget インターフェイスとまったく同じように見えるインターフェイスが必要です。ただし、タブを左側に配置することは絶対に必要です。このアプリケーションは、社内デバイス用の Android 携帯に展開する予定はありません。そのため、Android プラットフォームの設計上の考慮事項に違反する問題はありません。

フォーカス リスナーとリスト ビューの組み合わせを使用して、必要な機能をハックする実用的なプロトタイプが既にあります。それはきれいではなく、まだあまり自信がありませんが、当分の間は機能します。

私たちが本当に望んでいるのは、組み込みの TabWidget を使用する代わりに、プロトタイプの UI コードをすべて破棄することです。ただし、TabWidget は上部のタブでのみ機能するようにハードコードされているため、これは実際にはオプションではありません。

では、代わりに横にタブがある TabWidget 機能を処理するパッチ、またはパッチのセット、あるいはカスタム クラスを誰かが持っていることを期待していますか?

TabWidget の関連コードは次のとおりです: http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/TabWidget.java&q=android%20package:git://android .git.kernel.org%20lang:java%20tabwidget&sa=N&cd=1&ct=rc

タブを上部に配置するためにハードコードされている特定の機能は

private void initTabWidget() {
    setOrientation(LinearLayout.HORIZONTAL);
    mGroupFlags |= FLAG_USE_CHILD_DRAWING_ORDER;

    final Context context = mContext;
    final Resources resources = context.getResources();

    if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) {
        // Donut apps get old color scheme
        if (mLeftStrip == null) {
            mLeftStrip = resources.getDrawable(
                    com.android.internal.R.drawable.tab_bottom_left_v4);
        }
        if (mRightStrip == null) {
            mRightStrip = resources.getDrawable(
                    com.android.internal.R.drawable.tab_bottom_right_v4);
        }
    } else {
        // Use modern color scheme for Eclair and beyond
        if (mLeftStrip == null) {
            mLeftStrip = resources.getDrawable(
                    com.android.internal.R.drawable.tab_bottom_left);
        }
        if (mRightStrip == null) {
            mRightStrip = resources.getDrawable(
                    com.android.internal.R.drawable.tab_bottom_right);
        }
    }

    // Deal with focus, as we don't want the focus to go by default
    // to a tab other than the current tab
    setFocusable(true);
    setOnFocusChangeListener(this);
}

誰かが何か情報を持っていれば、私は大いに感謝します。

4

2 に答える 2

1

(行を過ぎて、より良い回答をさらに下に追加したことに注意してください。他の人のニーズにより適している場合に備えて、この一番上の回答を残しています。)

ええ、私は同じ問題を扱ってきました。私はやや不格好な解決策を持っています。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からスクロールのものを入手しました。わーい!

于 2011-07-13T21:37:50.113 に答える