片段内的按钮与下一个片段的按钮重叠
Button inside fragment overlap with next fragment's button
我的应用程序的注册页面分为三个片段。 FragmentA
、FragmentB
和 FragmentC
附加到同一个 activity。单击 FragmentA
中的下一个按钮时,它将调用 FragmentB
,FragmentB
和 FragmentC
也是如此。当我向前移动时,前一个片段的按钮与当前片段重叠。下面是我的代码。我怎样才能避免这种情况?
MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signup_page);
init();
}
private void init() {
ViewPager2 viewPager = findViewById(R.id.signup_pager);
List<Fragment> fragmentList = new ArrayList<Fragment>();
FragmentA aFragment = new FragmentA();
FragmentB bFragment = new FragmentB();
fragmentList.add(aFragment);
fragmentList.add(bFragment);
SignupFragmentPagerAdapter signupFragmentPagerAdapter = new SignupFragmentPagerAdapter(this,fragmentList);
viewPager.setUserInputEnabled(false);
viewPager.setAdapter(signupFragmentPagerAdapter);
}
}
FragmentA.class
public class FragmentA extends Fragment {
EditText et_name;
Spinner sp_user_type;
Button bt_next;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fraga,container,false);
et_name = view.findViewById(R.id.editTextTextPersonName);
sp_user_type = view.findViewById(R.id.user_spinner);
bt_next = view.findViewById(R.id.button8);
bt_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentB bFragment = new FragmentB();
FragmentManager manager = getParentFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.frag_a, bFragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
FragmentB.class
public class FragmentB extends Fragment {
Button bt_next;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragb,container,false);
bt_next = view.findViewById(R.id.button9);
bt_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentC cFragment = new FragmentC();
FragmentManager manager = getParentFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.frag_b, Fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
问题原因:
您正在片段A本身内进行片段交易(从A到B);而不是通过这些片段的占位符(在你的情况下是 ViewPager
本身;所以 MainActivity
仍然看到 ViewPager
在第一页,因此在背景.
你有两种选择来解决这个问题:
- 首先:由于您禁用了页面滚动;我看不出有什么用
ViewPager
.. 所以你可以在
main activity,并在此占位符上进行片段交易。
- 其次:如果你有需要就
ViewPager
,而不是制作
片段交易,你可以使用
viewPager.setCurrentItem(position)
并将位置设置为
目标片段根据您在适配器中添加它们的顺序。
当你点击按钮时,你可以从你的片段中做到这一点:
((MainActivity)requireActivity()).myViewPager.setCurrentItem(position)
我的应用程序的注册页面分为三个片段。 FragmentA
、FragmentB
和 FragmentC
附加到同一个 activity。单击 FragmentA
中的下一个按钮时,它将调用 FragmentB
,FragmentB
和 FragmentC
也是如此。当我向前移动时,前一个片段的按钮与当前片段重叠。下面是我的代码。我怎样才能避免这种情况?
MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signup_page);
init();
}
private void init() {
ViewPager2 viewPager = findViewById(R.id.signup_pager);
List<Fragment> fragmentList = new ArrayList<Fragment>();
FragmentA aFragment = new FragmentA();
FragmentB bFragment = new FragmentB();
fragmentList.add(aFragment);
fragmentList.add(bFragment);
SignupFragmentPagerAdapter signupFragmentPagerAdapter = new SignupFragmentPagerAdapter(this,fragmentList);
viewPager.setUserInputEnabled(false);
viewPager.setAdapter(signupFragmentPagerAdapter);
}
}
FragmentA.class
public class FragmentA extends Fragment {
EditText et_name;
Spinner sp_user_type;
Button bt_next;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fraga,container,false);
et_name = view.findViewById(R.id.editTextTextPersonName);
sp_user_type = view.findViewById(R.id.user_spinner);
bt_next = view.findViewById(R.id.button8);
bt_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentB bFragment = new FragmentB();
FragmentManager manager = getParentFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.frag_a, bFragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
FragmentB.class
public class FragmentB extends Fragment {
Button bt_next;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragb,container,false);
bt_next = view.findViewById(R.id.button9);
bt_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentC cFragment = new FragmentC();
FragmentManager manager = getParentFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.frag_b, Fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
}
问题原因:
您正在片段A本身内进行片段交易(从A到B);而不是通过这些片段的占位符(在你的情况下是 ViewPager
本身;所以 MainActivity
仍然看到 ViewPager
在第一页,因此在背景.
你有两种选择来解决这个问题:
- 首先:由于您禁用了页面滚动;我看不出有什么用
ViewPager
.. 所以你可以在 main activity,并在此占位符上进行片段交易。 - 其次:如果你有需要就
ViewPager
,而不是制作 片段交易,你可以使用viewPager.setCurrentItem(position)
并将位置设置为 目标片段根据您在适配器中添加它们的顺序。 当你点击按钮时,你可以从你的片段中做到这一点:
((MainActivity)requireActivity()).myViewPager.setCurrentItem(position)