5

我的雇主让我在一个具有非常特定 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);
}

如果有人有任何信息,我将不胜感激。

4

2 回答 2

1

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

于 2010-08-16T22:26:33.563 回答
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。其他选项卡也需要类似地向后旋转。我搞砸了一段时间,可能有些事情是不必要的。例如,主视图。我认为不需要在那里。哦,如果 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。耶!

于 2011-07-13T21:37:50.113 回答