以编程方式在 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 的布局小部件之间设置约束是不可能的的主要内容,如果未能解决你的问题,请参考以下文章
Angular UI select2 指令 - 以编程方式更新模型未反映在小部件上
如何将 Retrofit 中的信息实现到 viewPager2 布局小部件中