0

RelativeLayoutにはConstraintLayout(それ以外はいくつかあります)があり、これはプログラムで子どもを配置しています。すべての子ビューを初期化した後、親のサイズを変更するのが苦労しています。RelativeLayout子を追加した後にビューのサイズを更新します。

基本的に私が達成しようとしている何がこの次のとおりです。ここで

quick mockup

コードスニペットです:

@BindView(R.id.session_summary_items_include_correct) View mCardCorrect; 

//... 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_session_summary_items, container, false); 
    ButterKnife.bind(this, view); 
    correctCard = new IncludedCard(); 
    ButterKnife.bind(correctCard, mCardCorrect); 

    initializeViews(); 

    mCardCorrect.post(() -> resizeView(mCardCorrect)); 

    return view; 
} 

private void initializeViews(){ 
    ArrayList<MyClass> items = MyClass.GetItems(); 
    LayoutInflater layoutInflater = (LayoutInflater) getActivity().getApplicationContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  

    if (items.size() > 0){ 
     correctCard.mCardTitle.setText("Correct Card"); 
     ArrayList<View> views = getItemViews(items, layoutInflater); 
     populateLayoutWithItemViews(correctCard.mConstraintLayout, views); 
    } 
} 

private ArrayList<View> getItemViews(ArrayList<MyClass> items, LayoutInflater inflater){ 
    ArrayList<View> results = new ArrayList<>(); 
    for (MyClass item : items){ 
     View view = inflater.inflate(R.layout.item_view, null); 
     TextView mTextTitle = (TextView) view.findViewById(R.id.item_view_title); 
     mTextTitle .setText(item.getTitle()); 
     results.add(view); 
    } 
    return results; 
} 

private void populateLayoutWithItemViews(ConstraintLayout layout, ArrayList<View> items){ 

    ConstraintSet constraintSet = new ConstraintSet(); 
    constraintSet.clone(layout); 

    for (int idx = 0; idx < items.size(); idx ++){ 
     View item = items.get(idx); 
     item.setId(View.generateViewId()); 
     layout.addView(item); 

     // constraintSet magic to make them connect as expected 

    } 

    constraintSet.applyTo(layout); 
} 

private void resizeView(View view){ 

    view.setLayoutParams(new RelativeLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
} 

static class IncludedCard{ 
    @BindView(R.id.card_title) TextView mCardTitle; 
    @BindView(R.id.card_layout) ConstraintLayout mConstraintLayout; 
} 

さて、問題はどこでも、いつでも、しかし、私はよということですmCardCorrect Viewを測定/サイズ変更すると、結果は同じです:ConstraintLayout内の子アイテムが存在しないかのように、カードタイトルまで測定されます。このように:FrameLayout child view not updating correctly on resize 、ここのようなOnGlobalLayoutListener使用:

measurement bounding box

私はここのようなのRunnableにリサイズ/測定を投稿しようとしましたAndroid: set view height via ViewTreeObserver 。私はまだAndroidのnewbです。これは私の最初のプロジェクトです。どんな助けでも大歓迎です。ありがとう!

答えて

0

各ビューを拘束する必要があります。 "Build a Responsive UI with ConstraintLayout"

...デバイスでレイアウトを実行するときにビューに制約がない場合は、[0,0](左上隅)に描画されます。

追加したすべてのビューには制約がないため、すべてが(0、0)で重なり合っています。

ConstraintSetを正しく設定しているようですが、ConstraintSetを使用して制約を追加するだけで済みます。これを行う方法を示すオンラインの良いチュートリアルがいくつかあります。 Hereは1です。 official documenationを参照することもできます。

関連する問題