getLayoutParam返回宽度为-1

时间:2016-08-30 06:49:05

标签: android

我正在尝试以编程方式设置布局宽度。

 ViewTreeObserver vtoRecyclerView = mMainLayout.getViewTreeObserver();
        vtoRecyclerView.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mMainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                ViewGroup.LayoutParams lpView = mMainLayout.getLayoutParams();
                lpView.width = ViewGroup.LayoutParams.MATCH_PARENT-20;
                mMainLayout.requestLayout();

            }
        });

但是mMainLayout.getLayoutParams()宽度返回为-1 。所以当我将 width设置为match_parent - 20 时,它变为 -21 。我想将width设置为 match_parent - 20 。 这种方法有什么问题。

5 个答案:

答案 0 :(得分:4)

此处代码的根本问题是因为您将宽度设置为:

lpView.width = ViewGroup.LayoutParams.MATCH_PARENT-20;

而ViewGroup.LayoutParams.MATCH_PARENT是常量。 您可以在ViewGroup类上找到常量

public static final int MATCH_PARENT = -1;

这很明显,因为-1 - 20是-21

您可以在这里做的是,您可以将行更改为

lpView.width = mMainLayout.getWidth()-20;

答案 1 :(得分:1)

试试这个。

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;

ViewTreeObserver vtoRecyclerView = mMainLayout.getViewTreeObserver();
    vtoRecyclerView.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mMainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            ViewGroup.LayoutParams lpView = mMainLayout.getLayoutParams();
            lpView.width = width -20;
            mMainLayout.requestLayout();

        }
    });

答案 2 :(得分:0)

试试这个。

   ViewTreeObserver vtoRecyclerView = mMainLayout.getViewTreeObserver();
        vtoRecyclerView.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if(mMainLayout.getWidth > 10 && mMainLayout.getHeight() > 10)  // you can modify this value.
                {
                    mMainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    ViewGroup.LayoutParams lpView = mMainLayout.getLayoutParams();
                    lpView.width = ViewGroup.LayoutParams.MATCH_PARENT-20;  // This seems to be wrong;
                    ViewParent parent = mMainLayout.getParent();
                    if(parent != null) {
                        lpView.width = (View)parent.getWidth();
                    }
                    mMainLayout.requestLayout();
                }
            }
        });

答案 3 :(得分:0)

将宽度设置为match_parent时遇到了同样的问题,我通过获取手机屏幕宽度解决了这个问题:

Display display = ((Activity) context).getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int ActualWidth=width-(`margin you set for view`);

希望它会有所帮助:)

答案 4 :(得分:0)

由于ViewGroup.LayoutParams.MATCH_PARENT常量预定义数值为-1,因此您获得-21作为结果。您可以通过将margin定义为布局而不是使用该方法来实现您的目标。