【问题标题】:Create constraint layout chain programmatically以编程方式创建约束布局链
【发布时间】:2019-06-01 12:27:22
【问题描述】:

我有一个约束布局,它由 2 个静态文本视图和一些以编程方式添加的按钮组成。我想创建一个包含所有按钮的链,但由于一些按钮卡在布局的中底部,我无法使其正常工作。

我将在下面提供代码,也许有人可以提示我做错了什么。

 protected void onPostExecute(JSONArray result){
    super.onPostExecute(result);
        try {
            ConstraintLayout cl = (ConstraintLayout) findViewById(R.id.menu);
            ConstraintSet set = new ConstraintSet();
            List<Integer> chainIDs = new ArrayList<Integer>();
            int medId;
            for(int i=0; i < result.length() ; ++i)
            {
                if(i<1){
                    JSONObject json = result.getJSONObject(i);
                    Button btn = new Button(Menu.this);
                    btn.setId(i);
                    int startID = btn.getId();
                    btn.setText(json.getString("nume"));
                    btn.setBackgroundColor(getResources().getColor(R.color.yellow));
                    int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,153,getResources().getDisplayMetrics());
                    int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,43,getResources().getDisplayMetrics());
                    int margins = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,8,getResources().getDisplayMetrics());
                    ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(width,height);
                    lp.setMargins(margins,margins,margins,margins);
                    cl.addView(btn, lp);
                    set.clone(cl);
                    set.connect(startID, ConstraintSet.LEFT,ConstraintSet.PARENT_ID , ConstraintSet.LEFT, 0);
                    set.connect(startID, ConstraintSet.RIGHT,ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
                    Button btn1 =  findViewById(startID);
                    btn1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(Menu.this,"Apasare button", Toast.LENGTH_LONG).show();
                        }
                    });
                    chainIDs.add(startID);
                    set.applyTo(cl);
                    Log.d("STATE",Integer.toString(i));
                }else
                    {
                    JSONObject json = result.getJSONObject(i);
                    Button btn = new Button(Menu.this);
                    btn.setId(i);
                    medId = btn.getId();
                    btn.setText(json.getString("nume"));
                    btn.setBackgroundColor(getResources().getColor(R.color.yellow));
                    int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,153,getResources().getDisplayMetrics());
                    int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,43,getResources().getDisplayMetrics());
                    int margins = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,8,getResources().getDisplayMetrics());
                    ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(width,height);
                    lp.setMargins(margins,margins,margins,margins);
                    cl.addView(btn, lp);
                    set.clone(cl);
                    set.connect(medId, ConstraintSet.LEFT,ConstraintSet.PARENT_ID , ConstraintSet.LEFT, 0);
                    set.connect(medId, ConstraintSet.RIGHT,ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
                    set.applyTo(cl);
                    Button btn1 =  findViewById(medId);
                    btn1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(Menu.this,"Apasare button", Toast.LENGTH_LONG).show();
                        }
                    });
                    chainIDs.add(medId);
                    Log.d("STATE",Integer.toString(i));
                }

            }
            int[] chain = new  int [chainIDs.size()];
            Iterator<Integer> iterator = chainIDs.iterator();
            for (int j = 0; j < chain.length; j++)
            {
                chain[j] = iterator.next().intValue();
            }
            set.createVerticalChain(R.id.descriere,ConstraintSet.BOTTOM,ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,chain,null, ConstraintSet.CHAIN_SPREAD);
            set.applyTo(cl);
            setContentView(cl);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

这是实际输出:https://imgur.com/a/sM0HBkT

所需的输出类似于:

开始布局
文本视图
按钮 1
按钮 2
.
.
.
按钮 n
布局结束
编辑 使用View.generateViewId()方法后解决

【问题讨论】:

  • @Cheticamp 我放 0 因为我看到它在其他示例中有效,顺便说一句,如果我将任何内容应用于该特定控件,它会发生变化,所以我认为这不是问题所在。我更新了我的帖子,现在检查代码的样子,createVerticalChain() 方法也更新了。
  • @Cheticamp 请发布答案,以便我可以批准作为我问题的正确答案。谢谢
  • @Cheticamp 简而言之,我只使用了generateViewId() 来生成控件的ID,并将参数更改为createVerticalChain() 方法。

标签: android android-constraintlayout constraint-layout-chains


【解决方案1】:

零不是有效的视图 ID。有关如何生成有效 id 的信息,请参阅 generateViewId()。

同时检查createVerticalChain() 的参数是否正确。第二个参数应该是一个边而不是一个 id。

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 2015-10-17
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2022-07-08
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多