在Fragment中,getWidth返回0,getPaddingLeft返回非零值

7

我正在尝试将我的Android应用程序转换为Fragments以支持多个屏幕尺寸并正确使用新的ICS选项卡。之前,我使用onWindowFocusChanged()方法并在其中运行下面的代码 - 基本上在创建布局后对其进行了一些动态格式化。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

LinearLayout theLayout = (LinearLayout)inflater.inflate(R.layout.tab_frag2_layout, container, false);

getWidthEditButton = (ImageButton) theLayout.findViewById(R.id.buttonEditPoints);
buttonAddPointsManual = (ImageView) theLayout.findViewById(R.id.buttonAddPointsManual);

linearPointsUsed = (LinearLayout) theLayout.findViewById(R.id.linearLayoutPointsUsed);

int paddingLeftForTracker = linearPointsUsed.getPaddingLeft();
int paddingRightForTracker = getWidthEditButton.getWidth();

linearPointsUsed.setPadding(paddingLeftForTracker, 0, paddingRightForTracker, 0);
}

现在我已经转移到Fragments,但是我的paddingRightForTracker返回0。以前我遇到过一个问题,那时我试图过早地获取宽度,因此我之前转移到onWindowFocusChanged,但是这对于Fragments不可用。奇怪的是,paddingLeftForTracker实际上返回了一个非零值。
如果我手动设置paddingRightForTracker,更改就会发生,所以我知道代码正在运行。只是无法弄清楚为什么我的getWidth返回0。
非常感谢任何帮助。
2个回答

22

您可以尝试在onActivityCreated()中完成此操作。因此,在onCreateView中保存这些视图的引用,然后在onActivityCreated()中访问它们。我认为当您尝试访问它时,视图尚未完全创建,这就是为什么它返回无宽度的原因。

http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle)


好的,我发现了另一种获取宽度的方法。在onViewCreated、onCreateView和onResume中,我也无法获取按钮的宽度。我找到了这个方法,尝试了一下,它返回了一个值,所以也许对你有用!

如何获取按钮的高度和宽度

ViewTreeObserver vto = button.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
        width = button.getWidth();
        height = button.getHeight(); 
    }
});

顺便提一下,我在onResume中运行了这段代码,所以我不太确定它在哪里还能起作用。


getPaddingLeft和getWidth有什么不同吗?它们应该都返回0或者都返回非零值,对吧?我的问题就在于,getPaddingLeft返回了一个非零值,但是getWidth没有。所以如果View还没有被绘制,我不应该得到任何一个值。也许我错了。 - mattdonders
1
getPaddingLeft 应该只返回已经设置的值。当您说它返回一个非零值时,它是 XML 中设置的值吗?(您的初始布局是什么样子的?) - leenephi
哦哦哦,我实际上没有考虑到这一点。我在LinearLayout的XML中设置了paddingLeft的值,因此即使布局尚未绘制,它也会返回非零值。所以根据您上面的建议,我将尝试在那个函数中实现代码 - 谢谢。 - mattdonders
所以我在public void onActivityCreated(Bundle savedInstanceState)中尝试了int paddingRightForTracker = buttonEditPoints.getWidth();,但仍然得到0的宽度。FYI:buttonEditPoints =(ImageButton)theLayout.findViewById(R.id.buttonEditPoints);在onCreateView中声明,因此它确实有一个赋值。 - mattdonders
这里有一个问题,它被多次调用了。 - Moisés Olmedo
显示剩余5条评论

1

这对我很有效,看起来更加简洁(我也使用lambda但不是必需的):

v.post(() -> {
        int width = v.getWidth();
        doSomething(width>300);
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接