Создание цепочки макетов ограничений программно - PullRequest
0 голосов
/ 06 января 2019

У меня есть макет ограничения, который состоит из 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

Желаемый результат будет выглядеть примерно так:

начать макет
TextView
Кнопка 1
Кнопка 2
.
.
.
кнопка n
конец макета
EDIT Решено после использования View.generateViewId() метод

1 Ответ

0 голосов
/ 07 января 2019

Ноль не является действительным идентификатором просмотра. См. GenerateViewId (), чтобы узнать, как генерировать действительные идентификаторы.

Также убедитесь, что у вас есть правильные аргументы для createVerticalChain () . Вторым аргументом должна быть сторона, а не идентификатор.

...