如何以编程方式将视图扭曲为ConstraintLayout中的父级 [英] How to contrain a view programmatically to parent in ConstraintLayout

查看:32
本文介绍了如何以编程方式将视图扭曲为ConstraintLayout中的父级的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望使用约束布局以编程方式创建一个TextView(或任何其他视图)。在XML中,文本视图将如下所示:

<TextView
    android:id="@+id/textView_Test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Test "
    android:textSize="19sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintVertical_bias="0.16"
    app:layout_constraintHorizontal_bias="0.02"
    app:layout_constraintTop_toTopOf="parent" />

所以它应该被约束到所有边的父项,然后我可以使用偏移参数来动态改变它的位置。我如何才能实现这一点?我看过这里给出的答案ConstraintLayout: change constraints programmatically,但那里的对象不受父级的限制,也没有使用垂直和水平偏移来动态定位它,这是我想要的。你知道这在片段中是否可能以及如何实现(我使用单活动多片段方法)吗?

更新: 我现在可以通过编程方式在受约束的布局中插入一个自定义视图(而不是TextView)。但是,使用代码 constraintSet.setHorizontalBias(view.getId(), 0.56f);设置方向没有任何效果(没有Mather,我使用的是哪个数字)。自定义视图始终位于左上角。

这里可以看到整个片段的代码(我指的是重要部分):

public class Test extends Fragment implements Runnable {

    /*
    Game variables
     */

    public static final int DELAY_MILLIS = 100;
    public static final int TIME_OF_A_LEVEL_IN_SECONDS = 90;
    private int currentTimeLeftInTheLevel_MILLIS;
    private Handler handler = new Handler();
    private FragmentGameBinding binding;

    private boolean viewHasBeenCreated = false;


    public Test() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragmentGameBinding.inflate(inflater, container, false);
        container.getContext();
        viewHasBeenCreated = true;
        startRound();
        return binding.getRoot();


    }

    public void startRound () {
        currentTimeLeftInTheLevel_MILLIS =TIME_OF_A_LEVEL_IN_SECONDS * 1000;
        updateScreen();
        handler.postDelayed(this, 1000);

    }
    private void updateScreen() {
        binding.textViewTimeLeftValue.setText("" + currentTimeLeftInTheLevel_MILLIS/1000);

        /*
        IMPORTANT PART: This should create a simple custom UI element
         */
        View view = new View(getActivity());
        view.setLayoutParams(new ViewGroup.LayoutParams(200, 200));
        Drawable dr = ContextCompat.getDrawable(getActivity(),R.drawable.light_bulb_layer_list);
        view.setBackground(dr);
        view.setId(View.generateViewId());

        ConstraintLayout constraintLayout = binding.constraintLayout;
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(constraintLayout);
        constraintSet.connect(view.getId(),ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM,0);
        constraintSet.connect(view.getId(),ConstraintSet.TOP,ConstraintSet.PARENT_ID ,ConstraintSet.TOP,0);
        constraintSet.connect(view.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID ,ConstraintSet.LEFT,0);
        constraintSet.connect(view.getId(),ConstraintSet.RIGHT,ConstraintSet.PARENT_ID ,ConstraintSet.RIGHT,0);
        constraintSet.setHorizontalBias(view.getId(), 0.56f);
        constraintSet.setVerticalBias(view.getId(), 0.5f);
        constraintSet.applyTo(constraintLayout);
        constraintLayout.addView(view);
    }

    private void countDownTime(){
        currentTimeLeftInTheLevel_MILLIS = currentTimeLeftInTheLevel_MILLIS -DELAY_MILLIS;
        updateScreen();
    }

    @Override
    public void run() {
        if(viewHasBeenCreated) {
            countDownTime();
        }

您知道为什么在约束布局中设置水平或垂直方向没有任何效果吗?

推荐答案

文档中ConstraintSet中有一个PARENT_ID用作约束的ID。

还设置了setHorizontalBiassetVerticalBias方法。

您引用的accepted answer斜杠问题向您展示了如何使用ConstraintSet

这篇关于如何以编程方式将视图扭曲为ConstraintLayout中的父级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆