使用xml布局dynamic添加片段到GridLayout是不行的

在我们的应用程序中,我们试图dynamic添加片段到GridLayout。 XML格式的空网格布局与片段的布局一样。 在运行时,我们检查一些数据,并从中确定要添加到布局的片段数量以及每个片段使用哪个布局。 当我们有片段为其生成的视图分配一个大小的时候,它是全部工作的,但是如果我们在片段的布局文件中指定了大小,则在网格布局中什么都不显示。 显然,我们可以在创build视图时简单地指定大小,但是我们更愿意在碎片的xml布局中进行,因为这样可以让我们利用Android的内置系统为每个设备select正确的布局。

我正在使用支持库碎片。 如果这有所作为,我不使用支持库GridLayout

相关的代码和XML如下:

GridLayout XML:

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <ScrollView android:id="@+id/grid_scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom_fragment" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="8dp" android:layout_marginTop="?android:attr/actionBarSize" android:overScrollMode="ifContentScrolls" > <GridLayout android:id="@+id/grid" android:layout_width="match_parent" android:layout_height="wrap_content" android:alignmentMode="alignMargins" android:animateLayoutChanges="true" android:columnCount="3" android:columnOrderPreserved="true" android:orientation="horizontal" android:overScrollMode="ifContentScrolls" android:rowOrderPreserved="true" > </GridLayout> </ScrollView> </merge> 

片段XML的一个例子

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="100dp" android:alpha="1" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="1.0" /> </RelativeLayout> 

片段onCreateView()方法

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View view; GridLayout.Spec rowSpec = GridLayout.spec(mRowStart, mRowSpan); GridLayout.Spec columnSpec; GridLayout.LayoutParams childParams; if (large) {; view = inflater.inflate(R.layout.my_place_large, container, false); columnSpec = GridLayout.spec(mColumnStart, 2); childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); //childParams.width = 200; //If I do this everything works regardless of the layout size } else { view = inflater.inflate(R.layout.my_place_small, container, false); columnSpec = GridLayout.spec(mColumnStart, 1); childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); //childParams.width = 100; //If I do this everything works regardless of the layout size } childParams.setMargins(0, 0, 0, 0); //childParams.height = 100; //If I do this everything works regardless of the layout size view.setLayoutParams(childParams); view.setId(ID); return view; } 

将碎片添加到布局

 private void populateGrid() { RelativeLayout gridParent = (RelativeLayout) mParentActivity.findViewById(R.id.locations); mLocationsGrid = (GridLayout) gridParent.findViewById(R.id.grid); nColumns = mLocationsGrid.getColumnCount(); mAdapter = new MyAdapter(mContext, this, mResolver); //This is how I keep track of the various fragments depending on my app's state int nCards = mAdapter.getNumberOfCards(); FragmentManager fragmentManager = mParentActivity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); for (int i = 0; i < nCards; ++i) { fragmentTransaction.add(mLocationsGrid.getId(), mAdapter.getFragmentAtIndex(i), String.valueOf(i)); } fragmentTransaction.commit(); mPopulated = true; } 

我认为应该覆盖它。 只是重申一下,如果我取消在onCreateView()中显式设置维度的行的注释,它们将在GridLayout中正确显示,因此我知道所有跟踪片段和此类作品的事情,片段事务也是如此。 问题出现在我试图指定片段的xml中的大小,在这种情况下,我得到一个空白的屏幕。

你的想法,build议和思考表示赞赏。 谢谢,Jared

Related of "使用xml布局dynamic添加片段到GridLayout是不行的"