不可能以编程方式在 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);
R.id.fragment_home_constraint_layout
是包含 ViewPager
和 A.
的约束布局
所以我想告诉"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
"。
问题是:它不起作用。没有错误,没有崩溃。但它根本没有生效。这就像约束未激活,未设置。
为什么以及如何做到这一点?
不可能限制具有不同父项的两个视图
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);
}
});
}
我有一个 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. 的约束布局
所以我想告诉"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 theViewPager
"。
问题是:它不起作用。没有错误,没有崩溃。但它根本没有生效。这就像约束未激活,未设置。
为什么以及如何做到这一点?
不可能限制具有不同父项的两个视图
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);
}
});
}