如何集中有时内容比屏幕宽的Android表?

时间:2011-09-20 22:00:11

标签: android android-layout

我有以下布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewFrameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="30dip">
    <ScrollView
        android:id="@+id/verticalScrollContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="10dip">
        <HorizontalScrollView
            android:id="@+id/horizontalScrollContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </HorizontalScrollView>
    </ScrollView>
</FrameLayout>

对于水平滚动容器,我以编程方式创建TableLayout并将其添加到Horizo​​ntalScrollView。用户可以控制应在表格中显示哪些列。有时,如果用户选择了许多列,则内容可能会溢出屏幕宽度。很多时候,桌子小于屏幕的宽度,我希望它居中。如果不解决居中问题,上面的布局对于从屏幕上溢出的表格来说效果很好。例如。双向滚动有效。但是,当我这样做时:

FrameLayout.LayoutParams lp = 
     new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                  LayoutParams.WRAP_CONTENT, Gravity.CENTER);
theTable.setLayoutParams(lp);

它开始表现得很奇怪。对于内容小于屏幕宽度的时间,它适当地居中。然而,当内容比屏幕宽时,内容居中,迫使桌子的一些左手侧从屏幕的左手侧消失。 E.g。

    SSSSSS
    SSSSSS
  TTTTTTTTTT
    SSSSSS
    SSSSSS

其中'S'是屏幕,'T'是表格。它也不可能向左滚动以查看截断内容(但向右滚动)。我在找什么:

如果表格小于屏幕宽度,则将其居中。 如果表格宽于屏幕宽度,则左对齐水平滚动。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

这个解决方案涉及挂钩到我的表的onGlobalLayoutListener,它在布局完成后触发(因此我可以访问表的显示宽度)。这是代码:

    final TableLayout table = (TableLayout)findViewById(R.id.the_table);
    ViewTreeObserver vto = table.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener()
    {
        public void onGlobalLayout()
        {
            ViewTreeObserver obs = table.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);

            int screenWidth = 
                       activity.getWindowManager().getDefaultDisplay().getWidth();


            //If the table is smaller than the screen width, setup new layout
            //parameters to center the table.  Otherwise, leave the table left 
            //aligned
            if (table.getWidth() < screenWidth)
            {
                FrameLayout.LayoutParams lp = 
                      new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                              LayoutParams.WRAP_CONTENT, Gravity.CENTER);
                table.setLayoutParams(lp);
            }
        }