2016-10-14 47 views
1

我有android.support.v7.widget.GridLayout有两列。我想将字段添加到网格,但不知道如何为此指定属性。如何指定GridLayout的嵌套元素的重量和宽度

我的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="10dp" 
    tools:context="com.mappolygon.PolygonDialogFragment"> 

    <android.support.v7.widget.GridLayout 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     app:columnCount="2"> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_lat1" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_lat1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/latitude_1" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_long1" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_long1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/longitude_1" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_lat2" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 

       android:id="@+id/et_lat2" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/latitude_2" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_long2" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_long2" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/longitude_2" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_lat3" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_lat3" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/latitude_3" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_long3" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_long3" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/longitude_3" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_lat4" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_lat4" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/latitude_4" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/layout_long4" 
      android:layout_width="0dp" 
      app:layout_columnWeight="1"> 

      <EditText 
       android:id="@+id/et_long4" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/longitude_4" 
       android:inputType="numberDecimal|numberSigned" /> 
     </android.support.design.widget.TextInputLayout> 
    </android.support.v7.widget.GridLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab_add_coordinates" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:src="@drawable/ic_add" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/btn_build_polygon" 
      style="@style/Base.Widget.AppCompat.Button.Colored" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom" 
      android:text="@string/build_polygon" /> 

     <Button 
      android:id="@+id/btn_cancel" 
      style="@style/Base.Widget.AppCompat.Button.Colored" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/cancel" /> 
    </LinearLayout> 
</LinearLayout> 

我的按钮操作(我使用Butterknife

@Bind({R.id.et_lat1, R.id.et_long1, R.id.et_lat2, R.id.et_long2, R.id.et_lat3, R.id.et_long3, R.id.et_lat4, R.id.et_long4}) 
    List<EditText> coordinatesList; 
    @Bind({R.id.layout_lat1, R.id.layout_long1, R.id.layout_lat2, R.id.layout_long2, R.id.layout_lat3, R.id.layout_long3, R.id.layout_lat4, R.id.layout_long4}) 
    List<TextInputLayout> inputLayoutList; 
    @Bind(R.id.grid) 
    GridLayout gridLayout; 
**...** 

    @OnClick(R.id.fab_add_coordinates) 
    void addFields(){ 
     TextInputLayout inputLayoutLat = new TextInputLayout(getActivity()); 
     TextInputLayout inputLayoutLng = new TextInputLayout(getActivity()); 
     EditText editTextLat = new EditText(getActivity()); 
     EditText editTextLng = new EditText(getActivity()); 

     inputLayoutLat.addView(editTextLat); 
     inputLayoutLng.addView(editTextLng); 

     coordinatesList.add(editTextLat); 
     coordinatesList.add(editTextLng); 
     inputLayoutList.add(inputLayoutLat); 
     inputLayoutList.add(inputLayoutLng); 

     gridLayout.addView(inputLayoutLat); 
     gridLayout.addView(inputLayoutLng); 
    } 

那么,如何设置权重和宽度在这种情况下?

+0

使用RecyclerView和GridLayoutManager ... GridView不再是推荐的方法。 – shivamDev

+0

我不认为最初支持体重 – jak10h

+0

@shivamDev我认为这将是简单形式的开销。你能分享一个GridLayout被弃用的链接吗? –

回答

0

GridLayout当您希望某些视图跨越多行/列时,特别适合在网格中放置视图。通常在这些情况下,您知道某个视图需要在哪个行/列。

仔细查看您的布局,我看到您正在编辑纬度/经度值,因此您可能需要两列。我猜你想要以编程方式添加行,以便使用户输入任意数量的坐标对。

如果是这种情况,我的建议是将ListView用于您的视图,并在每次需要新的坐标对时将新项目添加到列表中。您的清单项目视图可能是一个简单的水平LinearLayout。然后你可以实现你的目标,在任意行的同时加权视图的宽度。


是的,你可以通过使用GridLayoutLayoutParams在代码中设置列权重。

 int row = ...; 
    int col = ...; 
    float rowWeight = ...; 
    float colWeight = ...; 
    GridLayout.Spec rowSpec = GridLayout.spec(row, rowWeight); 
    GridLayout.Spec colSpec = GridLayout.spec(col, colWeight); 
    GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, colSpec); 
    params.width = ...; 
    params.height = LayoutParams.WRAP_CONTENT; 
    inputLayoutLat.setLayoutParams(params); 

如前所述,这只是在API 21和转发。

+0

来设置它。谢谢你的回答,它解释了什么是Spec。但是有没有什么办法可以在没有手动行和列检查的情况下添加行? –

+0

请看我更新的答案。 –