Я занимаюсь разработкой приложения, в котором мне нужны динамические вкладки и фрагменты c, а главная функция - динамическое удаление и добавление вкладок и фрагментов. Я завершаю функцию добавления, но при удалении вкладок у меня возникает одна проблема, когда я удаляю вкладку, вкладка удаляется, но удаляется какой-то другой фрагмент.
Например (добавление)
- Добавить фрагмент 1 - фрагмент 1 (содержимое A)
- Добавить фрагмент 2 - фрагмент 1 (содержимое A), фрагмент 2 ( содержимое B)
- Добавить фрагмент 3 - фрагмент 1 (содержимое A), фрагмент 2 (содержимое B), фрагмент 3 (содержимое C)
- Удалить фрагмент 2 - фрагмент 1 (содержимое A ), Фрагмент 3 (содержание B)
Пожалуйста, помогите мне идеально удалить фрагмент
MainActivity. java
public class MainActivity extends AppCompatActivity
{
Button buttonAddPage;
FragmentParent fragmentParent;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getIDs();
setEvents();
}
private void getIDs() {
buttonAddPage = (Button) findViewById(R.id.buttonAddPage);
fragmentParent = (FragmentParent) this.getSupportFragmentManager().findFragmentById(R.id.fragmentParent);
textView = (TextView) findViewById(R.id.editTextPageName);
}
private void setEvents() {
buttonAddPage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!textView.getText().toString().equals("")) {
fragmentParent.addPage(textView.getText() + "");
textView.setText("");
} else {
Toast.makeText(MainActivity.this, "Page name is empty", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
ParentFragment. java
public class FragmentParent extends Fragment {
private TabLayout tabLayout;
private ViewPager viewPager;
public static ViewPagerAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_parent, container, false);
getIDs(view);
setEvents();
return view;
}
private void getIDs(View view) {
viewPager = (ViewPager) view.findViewById(R.id.my_viewpager);
tabLayout = (TabLayout) view.findViewById(R.id.my_tab_layout);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
adapter = new ViewPagerAdapter(((MainActivity)getContext()).getSupportFragmentManager(),
getActivity(), viewPager, tabLayout);
}
viewPager.setAdapter(null);
viewPager.setAdapter(adapter);
}
int selectedTabPosition;
private void setEvents() {
tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
super.onTabSelected(tab);
viewPager.setCurrentItem(tab.getPosition());
selectedTabPosition = viewPager.getCurrentItem();
Log.d("Selected", "Selected " + tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
super.onTabUnselected(tab);
Log.d("Unselected", "Unselected " + tab.getPosition());
}
});
}
public void addPage(String pagename) {
Bundle bundle = new Bundle();
bundle.putString("data", pagename);
FragmentChild fragmentChild = new FragmentChild();
fragmentChild.setArguments(bundle);
adapter.addFrag(fragmentChild, pagename);
adapter.notifyDataSetChanged();
if (adapter.getCount() > 0) tabLayout.setupWithViewPager(viewPager);
viewPager.setCurrentItem(adapter.getCount() - 1);
setupTabLayout();
}
public void setupTabLayout() {
selectedTabPosition = viewPager.getCurrentItem();
for (int i = 0; i < tabLayout.getTabCount(); i++) {
tabLayout.getTabAt(i).setCustomView(adapter.getTabView(i));
}
}
}
ChildFragment. java
public class FragmentChild extends Fragment {
String childname;
TextView textViewChildName;
EditText editText;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_child, container, false);
Bundle bundle = getArguments();
childname = bundle.getString("data");
getIDs(view);
setEvents();
return view;
}
private void getIDs(View view) {
textViewChildName = (TextView) view.findViewById(R.id.textViewChild);
textViewChildName.setText(childname);
editText = (EditText) view.findViewById(R.id.editText);
editText.setText("");
}
private void setEvents() {
}
}
ViewPagerAdapter. java
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
Context context;
ViewPager viewPager;
TabLayout tabLayout;
FragmentManager fragmentManager;
private Fragment mPrimaryItem;
public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
TabLayout tabLayout) {
super(manager);
this.context = context;
this.viewPager = viewPager;
this.tabLayout = tabLayout;
this.fragmentManager = manager;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(FragmentChild fragment, String title) {
Log.d("Dataaa1",""+fragment.getId());
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.setPrimaryItem(container, position, object);
mPrimaryItem = (Fragment) object;
}
public void removeFrag(int position) {
removeTab(position);
Fragment fragment = mFragmentList.get(position);
destroyFragmentView(viewPager, position, fragment);
}
public View getTabView(final int position) {
View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Remove", "Remove");
removeFrag(position);
}
});
remove.setVisibility(View.VISIBLE);
tabItemName.setText(mFragmentTitleList.get(position));
tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));
return view;
}
public void destroyFragmentView(ViewGroup container, int position, Object object) {
FragmentTransaction trans = fragmentManager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
mFragmentList.remove(object);
mFragmentTitleList.remove(position);
notifyDataSetChanged();
}
public void removeTab(int position) {
if (tabLayout.getChildCount() > 0) {
tabLayout.removeTabAt(position);
}
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}