0

制約に従わない実行時生成UIで問題が発生します。 Android用のその他の回答とドキュメントにつきましては、ConstraintSetとその他の方法を試しました。LinearLayout内でConstraintLayoutの実行時制約を適用する

ConstraintLayout私は、アプリケーションの機能に不可欠な部分を持つカスタムクラスを拡張しています。私はこれらのオブジェクトを作成し、LinearLayoutにそれらを追加するWebサーバーからデータを取得します。 LinearLayoutConstraintLayout、およびTextViewはすべて適切なサイズを示します。しかし、TextViewはお互いに重なり合い、どんな制約にも従わない。

レイアウトエディタで手動でやりたいことのコピーを作成しても問題ありません。

私の現在の設定(thisがConstraintLayoutを拡張し、text_nametext_pointsTextView秒です):

this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

    this.addView(text_name); 
    this.addView(text_points); 

    ConstraintSet constraints = new ConstraintSet(); 

    constraints.clone(this); 

    constraints.constrainHeight(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainHeight(text_name.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_name.getId(), WRAP_CONTENT); 

    constraints.connect(text_name.getId(), LEFT, getId(), LEFT); 
    constraints.connect(text_points.getId(), RIGHT, getId(), RIGHT); 

    constraints.applyTo(this); 

constrainWidthconstrainHeight作品。私がそれらを取り除くか値を変更するとき、それは効果があります。しかし、connectビジネスのいずれも、何もしません。 TextViewはテキストのサイズが適切ですが、制約に従わない場合があります。私は.connectの仕事をするいくつかの行がありませんか?

明確にする:私はScrollView - >LinearLayout - >ConstraintLayout - >TextViewです。エディタで作成すると、制約がうまく機能します。実行時にConstraintSetを使用してConstraintLayoutのインスタンス化で作成された場合、接続された制約は効果を持ちませんが、他のプロパティは行いません。

Display in-app - TextViews overlap, not following constraints

EDIT:ただ確認するため、ここでは、行の#の出力は、のLinearLayout(LOCS)へのLinearLayout(LDIM)の大きさ、ConstraintLayout(LOCDIM)の大きさ、およびサイズを追加していますTextViews(TVDIM、TV2DIM):

09-03 14:19:18.664 D/LOCS: 2 
09-03 14:19:18.665 D/LDIM: 1080 w 
09-03 14:19:18.665 D/LDIM: 58 h 
09-03 14:19:18.665 D/LOCDIM: 1080 w 
09-03 14:19:18.666 D/LOCDIM: 29 h 
09-03 14:19:18.667 D/TVDIM: 165 w 
09-03 14:19:18.667 D/TVDIM: 29 h 
09-03 14:19:18.668 D/TV2DIM: 29 w 
09-03 14:19:18.668 D/TV2DIM: 29 h 

答えて

0

問題は、プログラム、ビューIDが適切に割り当てられていない、ということです。私はマージン、幅、高さ、スケール、回転のさまざまな組み合わせを試している間にこれを発見しました.2つのビューにはすべて同じ変更が適用されていました。

解決方法は、何らかの方法でIDを生成することによってIDを設定することです。ただし、低APIバージョン(< 17)、View.generateViewId()を対象とすることはできません。したがって、あなたはそれに巻き付けたもの、残念ながら醜いブロックのいずれかを使用する必要があります。その後、上から

int view_id; 

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    view_id = View.generateViewId(); 
} else { 
    view_id = new Random(System.currentTimeMillis()).nextInt(); 
} 

view.setId(view_id); 

を、あなたはConstraintSetためview_idまたはview.getId()を使用することができます。

の親の場合は、ConstraintLayoutに追加する場合は、ConstraintSet.PARENT_IDを使用できます。

0

この回答を参照してください、私はあなたがclone()命令が欠けていると思います。

Add view programatically in ConstraintLayout

+0

これには運がありません。それは最初のレンダリングの後に行わなければならない可能性がありますか? –

+0

私が想定したこれらのメソッドは、onCreateアクティビティメソッドまたはonCreateView Fragmentメソッドで使用されていました。私はビューの一部としてそれを試したことはありません。あなたのレイアウトを投稿すると、私は追加情報を提供することができるかもしれません。私は、あなたが試みている方法がもっと複​​雑だと思います。 – Juan

+0

私は、デバイスの現在の場所を指定して、Webサーバーからデータをストリーミングしています。データを確実に動的にロードすることは以前から行われています!レイアウトは 'ScrollView' - >' LinearLayout' - > 'ConstraintLayout' - >' TextView'のようになります。 ConstraintLayoutとTextViewsは、データがロードされると作成されます。データを渡すためにカスタムコンストラクタのConstraintLayoutを拡張しました。上記のスニペットは、拡張クラスのコンストラクタからのものです。 –

関連する問題