Android tabwidget的现有补丁允许左侧的选项卡?

时间:2010-08-16 21:26:40

标签: android patch tabwidget

我的雇主让我在一个具有非常特定的UI要求的Android应用程序上工作。具体来说,我们需要一个看起来与TabWidget接口完全相同的界面。但是,左侧的标签是绝对必须的。我们不会将此应用程序部署到任何Android手机,它用于内部设备,因此没有任何问题违反Android平台可能具有的任何设计注意事项。

我们已经有了一个工作原型,它使用焦点侦听器和列表视图的组合来破解我们需要的功能。它不漂亮,我们对它还不是很有信心,但它暂时有用。

我们真正喜欢的是抛弃我们的所有原型UI代码,以换取使用内置的TabWidget。但是,由于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);
}

如果有人有任何信息,我会非常感激。

2 个答案:

答案 0 :(得分:1)

我在底部有标签这个问题。我最后只是复制了所有选项卡背景drawables并制作了有状态drawables和textcolor的按钮,这些按钮看起来像是在主UI窗格中控制ViewFlipper以在视图之间切换的标签。

答案 1 :(得分:1)

(请注意,我在下面添加了一个更好的答案,超越了这条线。我将离开这个最顶层,以防它更符合其他人的需求。)

是的,我一直在处理同样的问题。我有点笨重的解决方案。我注意到你可以使用setRotate旋转任何View。不幸的是,这只会旋转其图像或其他内容,并且不能完全处理问题或位置或大小或对齐。即便如此,我已经设法凑齐了一些有点补偿它的东西,虽然它只完成了一半(如果你旋转到纵向方向,它就不能正常工作)。无论何时旋转平板电脑或重新布置布局或其他任何内容,都会调用以下内容。

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文件定义了一个空的tabhost,右侧有选项卡。只需在代码中添加标签即可;那里有帖子。复制/更改/执行您需要做的任何事情以使其符合您的需求。另外,因为它很酷,我在tabwidget周围添加了一个滚动视图,所以如果你有太多的标签,它会自动允许滚动。如果你不想要它,摆脱它。卷轴主要来自http://java.dzone.com/articles/scrolling-tabs-android。耶!