7

私たちのアプリケーションでは、GridLayoutにフラグメントを動的に追加しようとしています。空のグリッドレイアウトは、フラグメントのレイアウトと同様にXMLで定義されます。実行時にいくつかのデータを調べ、そこからレイアウトに追加するフラグメント数と各フラグメントに使用するレイアウトを決定します。フラグメントに生成されたビューにサイズを割り当てると、それはすべて機能しますが、フラグメントのレイアウトファイルでサイズを指定すると、グリッドレイアウトに何も表示されません。明らかに、ビューを作成するときに単にサイズを指定することはできますが、各デバイスの正しいレイアウトを選択するためのAndroidの組み込みシステムを利用できるため、フラグメントのXMLレイアウトで行うことをお勧めします。xmlレイアウトのフラグメントをGridLayoutに動的に追加する作業はありません

私はサポートライブラリの断片を使用しています。それが違いを作る場合、私はサポートライブラリのGridLayoutを使用していない

関連するコードとXMLは次のとおりです。

のGridLayout XML:フラグメント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 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> 

The fragment oncr eateView()メソッド

@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のサイズを指定しようとしたときに発生し、その場合は空白の画面が表示されます。

あなたの考え、提案や気持ちは分かります。 ありがとう、 Jared

答えて

6

これは非常に遅くなっていますが、これはまだ機会がありません。問題は、新しいLayoutParamsを動的に設定するときに、XMLレイアウトパラメータをオーバーライドすることです。 IEの場合:

view.setLayoutParams(childParams); 

これにより、XMLsの元の高さと幅の設定が消去されます。 childParamsのwidth/heightをコードのままにしておくだけでは、値が設定されていないわけではありません。 GridLayoutの場合、それらはundefinedに設定されています。

修正点は、まずViewの既存のLayoutParamの高さ/幅を保存し、新しいLayoutParamを動的に作成するときに使用することです。例:

これにより、行/列のコードをXMLに適用しながら、幅と高さを維持できます。

+1

これは実際に行ったことです。私はあなたがそれを書くために時間をかけたので、選択された答えをあなたに与えます。 – Jared

関連する問題