Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在Android的xml文件中定义为match parent,如何在任何适配器类的值中获取视图的实际宽度_Java_Android_Layout_Width_Layoutparams - Fatal编程技术网

Java 如果在Android的xml文件中定义为match parent,如何在任何适配器类的值中获取视图的实际宽度

Java 如果在Android的xml文件中定义为match parent,如何在任何适配器类的值中获取视图的实际宽度,java,android,layout,width,layoutparams,Java,Android,Layout,Width,Layoutparams,如何获取适配器类中任何布局或卡视图的宽度值? 我有一个用于自定义适配器类的布局文件,其中我采用了一个视图,该视图是card view,并且给定了宽度作为匹配父级,现在在适配器类中,我希望card view width的值为。 我尝试了多种方法,例如,将post方法与卡片视图或视图树观察者结合使用 CardView mCardView; int width=0; int rootWidth,rootHeight; mCardView = itemview.findViewById(R.id.mCa

如何获取适配器类中任何布局或卡视图的宽度值? 我有一个用于自定义适配器类的布局文件,其中我采用了一个视图,该视图是card view,并且给定了宽度作为匹配父级,现在在适配器类中,我希望card view width的值为。 我尝试了多种方法,例如,将post方法与卡片视图或视图树观察者结合使用

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

}

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


上述ans的参考。

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


上述ans的引用。

获取空值的原因

为此,我将提供以下示例:

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
根据示例,您可以看到我的文本
日志
在获得宽度之前运行。原因是my
bindviewholder
正在设置要查看的数据。过程完成后,它将提供my
宽度的正确值

同样的问题也发生在你身上。正如您所评论的,您的值在函数外部返回0。这是因为您的
onbindviewholder
正在处理中

解决问题的更好方法是

您可以使用SharedReferences在本地存储宽度。 为了解释,你们可以检查他提供的正确方法的答案


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

您得到空值的原因

为此,我将提供以下示例:

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
根据示例,您可以看到我的文本
日志
在获得宽度之前运行。原因是my
bindviewholder
正在设置要查看的数据。过程完成后,它将提供my
宽度的正确值

同样的问题也发生在你身上。正如您所评论的,您的值在函数外部返回0。这是因为您的
onbindviewholder
正在处理中

解决问题的更好方法是

您可以使用SharedReferences在本地存储宽度。 为了解释,你们可以检查他提供的正确方法的答案


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

通过获取匹配的父宽度,您想要实现什么?我只想要它的实际宽度值,以便在我的代码中进一步转换。先生,这不是正确的方式,因为它提供了错误的详细信息。通过获取匹配的父宽度,您想要实现什么?我只想要它的实际宽度值,以便在我的代码中进一步转换。先生,这不是正确的方式,因为它给出了错误的细节