Вкладки и фрагмент удаляются идеально, но содержимое фрагмента меняет положение фрагмента (Добавить и удалить вкладки и фрагменты Dynami c) - PullRequest
0 голосов
/ 17 марта 2020

Я занимаюсь разработкой приложения, в котором мне нужны динамические вкладки и фрагменты c, а главная функция - динамическое удаление и добавление вкладок и фрагментов. Я завершаю функцию добавления, но при удалении вкладок у меня возникает одна проблема, когда я удаляю вкладку, вкладка удаляется, но удаляется какой-то другой фрагмент.

Например (добавление)

  1. Добавить фрагмент 1 - фрагмент 1 (содержимое A)
  2. Добавить фрагмент 2 - фрагмент 1 (содержимое A), фрагмент 2 ( содержимое B)
  3. Добавить фрагмент 3 - фрагмент 1 (содержимое A), фрагмент 2 (содержимое B), фрагмент 3 (содержимое C)
  4. Удалить фрагмент 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);
}
}
...