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

Posted

技术标签:

【中文标题】以编程方式在 ViewPager 项目小部件和包含 ViewPager 的布局小部件之间设置约束是不可能的【英文标题】:Programatically setting constraints between a ViewPager's item's widget and a widget of the layout that contains the ViewPager is impossible 【发布时间】:2020-07-20 16:14:54 【问题描述】:

我有一个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);

R.id.fragment_home_constraint_layout 是包含ViewPager 和A 的约束布局。

所以我试图告诉“请限制 B,它是 ViewPager 的项目 (nota: item = fragment) 小部件,A,它是小部件其中还包含ViewPager"的布局。

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

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

【问题讨论】:

【参考方案1】:

不可能约束具有不同父级的两个视图

所以我试图告诉“请约束 B,这是 ViewPager 的 item (nota: item = fragment) 小部件,到 A,它是 还包含 ViewPager 的布局。

上述要求并不容易。您仍然可以在片段中使用一些回调。因此,每当您的小部件在片段中找到其位置时,活动视图也应该相应地移动。

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

通过点击 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);
            
        );
     

【讨论】:

以上是关于以编程方式在 ViewPager 项目小部件和包含 ViewPager 的布局小部件之间设置约束是不可能的的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式滚动 QScrollArea

Angular UI select2 指令 - 以编程方式更新模型未反映在小部件上

如何将 Retrofit 中的信息实现到 viewPager2 布局小部件中

Android:以编程方式启用/禁用应用小部件

如何以编程方式在 Flutter 中用 Empty Container() 小部件替换 Text() 小部件?

以编程方式在小部件中设置 TextClock 的日期格式