我的雇主让我在一个具有非常特定的UI要求的Android应用程序上工作。具体来说,我们需要一个看起来与TabWidget接口完全相同的界面。但是,左侧的标签是绝对必须的。我们不会将此应用程序部署到任何Android手机,它用于内部设备,因此没有任何问题违反Android平台可能具有的任何设计注意事项。
我们已经有了一个工作原型,它使用焦点侦听器和列表视图的组合来破解我们需要的功能。它不漂亮,我们对它还不是很有信心,但它暂时有用。
我们真正喜欢的是抛弃我们的所有原型UI代码,以换取使用内置的TabWidget。但是,由于TabWidget是硬编码的,只能使用顶部的选项卡,因此这不是一个选项。
所以,我们希望有人在那里有一个补丁,或一组补丁,或者可能是一个自定义类,用侧面的标签来处理TabWidget功能?
以及用于标记在顶部的硬编码的特定功能是
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);
}
如果有人有任何信息,我会非常感激。
答案 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。耶!