如果在Android的xml文件中定义为匹配父级的适配器类中的值,如何获取视图的实际宽度

时间:2019-06-29 11:58:50

标签: java android layout width layoutparams

如何获得适配器类内任何布局或卡片视图的值的宽度? 我有一个用于自定义适配器类的布局文件,在该适配器类中,我现在采用的视图是卡片视图,并给出了作为匹配父对象的宽度,我想要卡片视图的宽度值。 我尝试了多种方法,例如,将后置方法与名片视图或视图树观察器一起使用。

CardView mCardView;
int width=0;
int rootWidth,rootHeight;
mCardView = itemview.findViewById(R.id.mCardView);

// Method in Recyclerview Adapter Class
public void onBindHolder(final ViewHolder holder, final int position)
{
    // using viewtreeobserver to get width of view 
    ViewTreeObserver vto = mCardView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new 
        ViewTreeObserver.OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout() {
                    rootHeight = mCardView.getHeight();
                    rootWidth = mCardView.getWidth();
                }
            });
    }

    //Another method tried to get the width of the view 

    mCardView.post(new Runnable() {
        @Override
        public void run() {
            rootHeight = mCardView.getHeight();
            rootWidth = mCardView.getWidth();
        }
    });

     width = rootWidth;  //always return 0 in both th cases

}

2 个答案:

答案 0 :(得分:0)

您可以通过编程方式获取/设置任何视图的任何布局参数getLayoutParams()。例如,如果您想要身高,则可以使用iv.getLayoutParams().height

上述ans的参考。 https://developer.android.com/reference/android/widget/LinearLayout.LayoutParams

答案 1 :(得分:0)

原因是您获得空值。

为此,我将提供示例:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.card?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
            override fun onGlobalLayout() {
                holder.card?.getViewTreeObserver()?.removeGlobalOnLayoutListener(this);
                Log.e("widths", holder.card?.measuredWidth.toString())
            }
        })
        Log.e("text","i am here")
    }

此代码的输出是:

E/text: i am here
E/text: i am here
E/widths: 1080
E/widths: 1080

作为示例,您可以在获得宽度之前看到我的文本 Log。其背后的原因是我的bindviewholder正在设置数据以供查看。处理完成后,它将提供我的width的适当值。

您正在发生相同的问题。正如您评论的那样,您的值在函数外部返回0。这是因为在函数之外,您的onbindviewholder正在处理中。

您遇到问题的更好方法是

您可以使用 SharedPreferences 将宽度存储在Local中。 为了进行解释,您可以检查this的答案,他提供了正确的方法。

如果有什么我可以帮忙的,只需评论您的问题