3

いくつかの条件に基づいてプログラムで制約を削除して追加したいと考えています。ここではスクリーンショットです:ConstraintLayoutでプログラムで制約を削除/追加する

The button "create ad" has a top constraint

と私はこのようなものの、コードでそれを削除する:

here is button with removed constraint on top

プログラムで

、ここで実現したいにおけるので、同じ効果私が試したコードです:

if (advertisements.size() > 0) { //my own condition 
     ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) btnCreateAd.getLayoutParams(); 
     layoutParams.topToBottom = R.id.imvEmpty; //the imageview that is in center of the view 
     btnCreateAd.setLayoutParams(layoutParams); 
     recyclerView.setVisibility(View.VISIBLE); 
     txvMyAdEmptyText.setVisibility(View.GONE); 
     imvEmpty.setVisibility(View.GONE); 
     adapter.setList(advertisements); 
     adapter.notifyDataSetChanged(); 
    } else { 
     ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) btnCreateAd.getLayoutParams(); 
     layoutParams.topToBottom = -1; //here i am trying to remove top constraint but it doesn't work 
     btnCreateAd.setLayoutParams(layoutParams); 

     recyclerView.setVisibility(View.GONE); 
     txvMyAdEmptyText.setVisibility(View.VISIBLE); 
     imvEmpty.setVisibility(View.VISIBLE); 
     adapter.setList(new ArrayList<Advertisement>()); 
    } 
    mConstraintView.invalidate(); //this is my constraint view 

EDIT

私もtried usingConstraintSet持っているが、結果は何とか私の(親ビューの境界に設定されている)RecyclerView私はあなたのコードを働いていない

ConstraintSet set = new ConstraintSet(); 
    set.clone(parentView); 

    if (advertisements.size() > 0) { 

     recyclerView.setVisibility(View.VISIBLE); 
     txvMyAdEmptyText.setVisibility(View.GONE); 
     imvEmpty.setVisibility(View.GONE); 
     adapter.setList(advertisements); 
     adapter.notifyDataSetChanged(); 

    } else { 

     set.connect(btnCreateAd.getId(), ConstraintSet.TOP, imvEmpty.getId(), ConstraintSet.BOTTOM, 0); 

     recyclerView.setVisibility(View.GONE); 
     txvMyAdEmptyText.setVisibility(View.VISIBLE); 
     imvEmpty.setVisibility(View.VISIBLE); 
     adapter.setList(new ArrayList<Advertisement>()); 
    } 
    set.connect(btnCreateAd.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END, 0); 
    set.connect(btnCreateAd.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, 0); 
    set.connect(btnCreateAd.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0); 

    set.applyTo(parentView); 
+0

これはhttps://stackoverflow.com/questions/5107740/how-do-i-programmatically-remove-an-existing-rule-that-was-defined-in-xml –

+0

@ValdioVeliuに役立ちますかどうかを確認申し訳ありませんが、それはRelativeLayoutのパラメータです。私はconstraintLayoutParamsから必要です。 –

+0

これについてGoogleに迷惑をかけたり、APIを見たことがありますか?この回答はあなたが探しているものではありませんが、アイデアを与える必要がありますhttps://stackoverflow.com/questions/41666566/constraintlayout-how-to-add-several-views-programmatically?rq=1 – Chisko

答えて

9

消滅しても異なっていました以下は、ConstraintSetを使用して制約を破棄して作成する方法を示しています。

ConstraintSet set = new ConstraintSet(); 
    ConstraintLayout layout; 

    layout = (ConstraintLayout) findViewById(R.id.layout); 
    set.clone(layout); 
    // The following breaks the connection. 
    set.clear(R.id.bottomText, ConstraintSet.TOP); 
    // Comment out line above and uncomment line below to make the connection. 
    // set.connect(R.id.bottomText, ConstraintSet.TOP, R.id.imageView, ConstraintSet.BOTTOM, 0); 
    set.applyTo(layout); 
+0

ありがとう、それは完全に働いています。 –

+0

最後に、プログラムで制約を削除する方法を得ました。ありがとうございました。 –

+0

間違ったリンク@bmjohns –

関連する問題