不可能以编程方式在 ViewPager 项目小部件和包含 ViewPager 的布局小部件之间设置约束

Programatically setting constraints between a ViewPager's item's widget and a widget of the layout that contains the ViewPager is impossible

我有一个 ConstraintLayout,其中包含一个 ViewPager 和另一个小部件,我们可以调用 "A"。我想在一个 ViewPager 的小部件(我们可以称为 "B")和 "A" 之间添加一个约束。 B 当然是一个实际上包含在片段中的小部件(因为 ViewPagers 使用片段)。请注意,此片段的布局也是 ConstraintLayout

事实是,如果我正确理解了我阅读和尝试的内容,我无法使用 XML 来做到这一点。

所以我尝试使用以下代码以编程方式进行操作:

ConstraintSet constraintSet = new ConstraintSet();
ConstraintLayout constraintLayout = inflated.findViewById(R.id.fragment_home_constraint_layout);
constraintSet.connect(R.id.B, ConstraintSet.TOP, R.id.A, ConstraintSet.BOTTOM,0);
constraintSet.applyTo(constraintLayout);

问题是:它不起作用。没有错误,没有崩溃。但它根本没有生效。这就像约束未激活,未设置。

为什么以及如何做到这一点?

不可能限制具有不同父项的两个视图

So I'm trying to tell "Please constrain B, which is the ViewPager's item (nota: item = fragment) widget, to A, which is the widget of the layout which also contains the ViewPager".

以上要求并不容易。您仍然可以在片段中使用一些回调。因此,只要您的片段中的小部件有机会找到它的位置,activity 视图也应该相应地移动。

下面的例子对你来说应该是一个好的开始。

通过单击 Viewpager Fragment 中的按钮,activity 布局中的小部件会更改其位置。

 @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        button = view.findViewById(R.id.buttonmove);
        viewPager = getActivity().findViewById(R.id.vpPager);
        activityButton = getActivity().findViewById(R.id.activity_button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ConstraintLayout constraintLayout = (ConstraintLayout) getActivity().findViewById(R.id.fragment_home_constraint_layout);
                ConstraintSet set = new ConstraintSet();
                set.constrainWidth(R.id.activity_button, ConstraintSet.WRAP_CONTENT);
                set.constrainHeight(R.id.activity_button, ConstraintSet.WRAP_CONTENT);
                set.centerHorizontally(R.id.activity_button, R.id.fragment_home_constraint_layout);
                set.connect(R.id.activity_button, ConstraintSet.TOP, R.id.vpPager, ConstraintSet.BOTTOM, 200);
                set.applyTo(constraintLayout);
            }
        });
    }