如何确定tabcontent区域的DIP高度?

时间:2011-09-08 22:10:03

标签: android android-layout

tl; dr:如何获取FrameLayout的DIP高度?

完整:我正在尝试设计一个可用的常规分辨率一致的布局。我已经了解了Google上的开发人员最佳实践,这对我的理解有所帮助。我已经将图标转换为9-patch,并且正在使用DIP高度,这大大改善了很多东西。

然而,我被困住的地方是尝试播放三行按钮,这些按钮将占据屏幕的其余部分,无论分辨率如何。我需要为小屏幕和平板电脑制作不同的东西,但我目前只担心大多数手机上的普通屏幕。

我的布局有一个TabWidget作为@android:id / tabs角色和一个FrameLayout用于@android:id / tabcontent

其中一个Tab活动只是3行按钮,我想填充整个FrameLayout,我怀疑我必须根据FrameLayout的高度来计算按钮的高度。

我的问题是,如何获得FrameLayout的DIP高度?

我已经尝试了一个GlobalLayoutListener并且只返回0.我尝试拉动LayoutParams并且只返回-1为FILL_PARENT。我需要FrameLayout的实际DIP高度来正确设置可用区域的高度。

我怎么能这样做,或者我错误地看着它?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我找到了一种方法来获得我想要的结果,而不是我尝试的确切方式,并且从未设法直接但间接地获得tabcontent的高度。

我发现了两种方法,我将在下面发布。

首先我做了方法2 但后来发现我更喜欢方法1 并决定采用它,因为它更具扩展性。

方法1

这是我从How to size an Android view based on its parent's dimensions找到的,是最可定制和可读的方法。在坚果壳中,您需要扩展FrameLayout并覆盖onMeasure方法。

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0dip"
    android:layout_margin="0dip">
    <LinearLayout
        android:id="@+id/topLayout"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="0dip"
        android:layout_margin="0dip">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:padding="0dip"
            android:layout_margin="0dip" />
        <view
            class="com.tmcaz.patch.TabContentFrameLayout"
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="0dip"
            android:layout_margin="0dip" />
    </LinearLayout>
</TabHost>

主要区别在于使用自定义类,您可以从事件本身处理大小调整,类似于方法2 ,但不需要进行任何计算来获取内容高度。

我这样做是为了让自己可以访问该事件并处理内容中的所有大小调整。阅读此内容的人可能需要覆盖其他内容并完全不同地处理onMeasure事件。

代码在

之下
public class TabContentFrameLayout extends FrameLayout {
        // add constructors, etc
        @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        // Should turn these in to member variables and reference it throughout.
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);

        this.setMeasuredDimension(parentWidth, parentHeight);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

方法2

我为idLinearLayout TabWidget分配了FrameLayout。这是我的main.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0dip"
    android:layout_margin="0dip">
    <LinearLayout
        android:id="@+id/topLayout"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="0dip"
        android:layout_margin="0dip">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="50dip"
            android:padding="0dip"
            android:layout_margin="0dip" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="0dip"
            android:layout_margin="0dip" />
    </LinearLayout>
</TabHost>

我为tabs指定了DIP高度,然后抓取LayoutParams的{​​{1}},我只是从结果中减去LinearLayout的高度。我在这里添加了代码仅用于基本说明目的,并且可以更高效地执行此操作,这不是我的生产代码:)

需要注意的一点是,在最有用的onCreate事件期间,您无法直接拉出布局的高度。您需要创建一个tabs来捕获布局中的更改并获取大小。

GlobalLayoutListener

public class MyTabActivity extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout ll = (LinearLayout)findViewById(R.id.topLayout);
        ll.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {

                    public void onGlobalLayout() {
                        DisplayLayoutDimensions();
                    }
                }
        );

         // Code here to add activities to the tabs, etc
}

希望这在某些方面对某人有所帮助。如果有人有更好的方法,请说出来。