Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Android 在我的getView方法中获取LinearLayout的宽度_Android_Width_Android Linearlayout - Fatal编程技术网

Android 在我的getView方法中获取LinearLayout的宽度

Android 在我的getView方法中获取LinearLayout的宽度,android,width,android-linearlayout,Android,Width,Android Linearlayout,我想在自定义适配器的getView方法中获取LinearLayout元素的宽度。我的getView方法如下所示: @Override public View getView(int position, View v, ViewGroup parent) { View mView = v; if (mView == null) { LayoutInflater vi = (LayoutInflater) getContext().

我想在自定义适配器的getView方法中获取LinearLayout元素的宽度。我的getView方法如下所示:

@Override
    public View getView(int position, View v, ViewGroup parent) {
        View mView = v;

        if (mView == null) {

            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            mView = vi.inflate(R.layout.levelselector_item, null);


        } 
if (mView != null) {
...
LinearLayout ln = (LinearLayout) mView.findViewById(R.id.lineScore);
            LinearLayout lnTotal = (LinearLayout) mView.findViewById(R.id.lineScoreTotal);
int widthTotal = lnTotal.getWidth()/2;
                ln.getLayoutParams().height = 3;
                ln.getLayoutParams().width = widthTotal;
                ln.requestLayout();
                ln.setBackgroundColor(Color.parseColor("#eef05e"));

}
        return mView;
    }

问题是我的总宽度似乎没有价值。如果我点击gridview的一个项目并点击后退按钮,那么我会突然看到一个黄色条。如果我输入ln.getLayoutParams().width=20;他还展示了一个黄色的短条。我只是不知道何时何地可以获得线性布局的宽度…

我认为在屏幕上设置布局(R.layout.levelselector_项)之前,您无法获得视图的宽度。它应该返回0。

看起来您正试图将
lineScore
视图的尺寸设置为3像素高和
lineScoreTotal
视图宽度的一半。不幸的是,您不能这样做,
getView
代码是在视图附加到活动的视图层次结构之前执行的,因此没有为任何内容定义大小

一种方法是定义自己的自定义视图,并按照中的建议覆盖测量。这也许是最干净的方法

另一个是尝试查询父视图的维度;说明填充等。;然后构建适当的宽度和高度测量规格,并在尝试查询尺寸之前布局
mView

另一种方法是创建一个布局,将总宽度划分为所需的比例。因为你还没有发布你的布局,所以我不能提出任何具体的建议。例如,如果行的容器是垂直
线性布局
,则可以执行以下操作:

<LinearLayout
     android:orientation="vertical"
     . . . >
     . . .
    <LinearLayout
         android:orientation="horizontal"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content">

         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="25" />
         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="50"
              android:background="#eef05e" />
         <View
              android:layout_width="0dp"
              android:layout_height="3dp"
              android:layout_weight="25" />
    </LinearLayout>
    . . .
</LinearLayout>

我还没有对此进行测试,所以我不能保证它会起作用,但这就是我的想法。

您可以用XML来代替在代码中设置维度。可以使用LinearLayout权重属性获取“一半”父宽度。e、 g

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:weightSum="2" >

    <View
        android:layout_width="0dp"
        android:layout_height="3dp"
        android:layout_weight="1"
        android:background="#eef05e" />

</LinearLayout>

我让它正常工作了。对于可能感兴趣的人:

我首先将gridview周围的边框设置为一个可以通过以xml形式添加到gridview中来控制的量:

android:listSelector="@null"
android:layout_margin="5dp"
然后我结合使用了Ted Hopp和Sameer的解决方案:因为我知道元素的填充是什么;网格视图周围为5dp,元素之间为2dp,元素中为15dp。我每行还有3项,这使我的代码看起来像:

int parentW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
                Resources r = C.getResources();
                float pxPaddingBetweenItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
                float pxPaddingInItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, r.getDisplayMetrics());

                int totalBarWidth = (parentW - (int)(2*pxPaddingBetweenItem)  - (int)(6*pxPaddingInItem))/3;
这正是我想要去的地方:)
谢谢

你是什么意思?调用R.layout.levelselector_项:if(mView==null){LayoutInflater vi=(LayoutInflater)getContext().getSystemService(Context.layout_充气器_SERVICE);mView=vi.inflate(R.layout.levelselector_项,null);}或者有其他方法解决这个问题?精确查询父视图的维度是什么意思?我知道的是,线性布局的宽度=mView.getWidth-(2*20dp),但我不知道是否可以从dp到px?也许这也是一个解决方案(或者你认为是?:)@JackCommonw-我指的是传递给
getView
的第三个参数。这将成为
getView
返回的视图的父视图。很抱歉,我仍然不知道“查询父视图的尺寸”以及使用适当的宽度和高度规格布局MVView是什么意思。。。你能再解释一下吗?你认为我上面的解决方案行得通吗?我试过:int test=mView.getWidth();Resources r=C.getResources();float px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,20,r.getDisplayMetrics());int submit=(测试-(2*(int)px))/2;但是我得到了一个错误。我试试你的method@JackCommonw-最简单的方法是定义自己的自定义视图,该视图可以适当地进行布局(或者更好地说,只是适当地绘制)。宽度是动态的。。。不是在我的例子中,但它将基于LLP的宽度。你的意思是宽度不必是父宽度的一半?在这种情况下,您可以在代码中设置权重。不,在本例中,我只是将其除以2,但实际上它将是(另一个值/我需要检索的总宽度)*100。。我不能让它工作。。。仍然没有,我想你知道你需要的母宽的百分比或分数。定义父项上的权重和,比如说100。在膨胀XML之后,将代码中的子元素的权重设置为这个百分比值。那么父元素到底告诉了我什么呢?我知道,与gridview中项目的最终视图相比,条形图的宽度(我现在使用的线性布局)将从左侧开始(左侧边距=20dp),并且可以有一个最大值,直到它达到20dp的右侧边距。
int parentW = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight();
                Resources r = C.getResources();
                float pxPaddingBetweenItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
                float pxPaddingInItem = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, r.getDisplayMetrics());

                int totalBarWidth = (parentW - (int)(2*pxPaddingBetweenItem)  - (int)(6*pxPaddingInItem))/3;