в Android как поместить кнопку выхода или закрытия на tabitems таблицы Android

#android #android-fragments #android-tablayout #tabitem

#Android #android-фрагменты #android-tablayout #tabitem

Вопрос:

У меня есть приложение для Android TabLayout , я создаю TabItems и назначаю их своим TabLayout динамически с помощью кода в моем MainActivity, в одном из моих Fragments , который является Fragment for a TabItem , у меня есть кнопка. я хочу, чтобы при нажатии на эту кнопку она TabItem закрывалась и уничтожалась, как я могу этого добиться? дополнительное объяснение: ниже приведен мой MainActivity.java код (где существует большая часть моего кода для создания динамического TabItems :

 public class MainActivity extends AppCompatActivity implements ContactsFragment.CallBacks {

    public static List<Fragment> fragments = new ArrayList<>();
    public static List<String> fragmentsTitle = new ArrayList<>();
    ViewPager viewPager;
    TabLayout tabLayout;

    public List<Fragment> getFragments() {
        return fragments;
    }

    public List<String> getFragmentsTitle() {
        return fragmentsTitle;
    }

    public void addToFragments(Fragment fragment) {
        fragments.add(fragment);
    }

    public void addToFragmentsTitle(String title) {
        fragmentsTitle.add(title);
    }

    public Fragment getFragmentsWithPosition(int position) {
        return fragments.get(position);
    }

    public String getFragmentsTitleWithPosition(int position) {
        return fragmentsTitle.get(position);
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page_drawer);
        this.tabLayout = findViewById(R.id.tab_layout);
        this.viewPager = findViewById(R.id.view_pager);
        tabLayout.setupWithViewPager(viewPager);
        SetUpViewPager(viewPager);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    }

    public void SetUpViewPager(ViewPager viewPager) {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter((getSupportFragmentManager()));
        Adapter.AddFragmentPage(new SignInFragment(),"ورود");
        Adapter.AddFragmentPage(new ContactsFragment(),"ارتباطات");
        Adapter.AddFragmentPage(new RegisterFragment(),"ثبت نام");
        viewPager.setAdapter(Adapter);
    }

    @Override
    public void send_user_object() {
        /* this is the implementation of abstract function defined
         in one of my tab , in which it has a button and when
         button is clicked i want the tab to be removed . */
    }

    public class MyViewPagerAdapter extends FragmentPagerAdapter {


        public MyViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        public void AddFragmentPage(Fragment frag,String title) {
            MainActivity.this.addToFragments(frag);
            MainActivity.this.addToFragmentsTitle(title);
        }

        public Fragment getItem(int position) {
            return MainActivity.this.getFragmentsWithPosition(position);
        }

        public CharSequence getPageTitle(int position) {
            return MainActivity.this.getFragmentsTitleWithPosition(position);
        }


        public int getCount() {
            List<Fragment> frag = MainActivity.this.getFragments();
            return frag.size();
        }
    }



}
 

на одной из моих предопределенных вкладок у меня есть listview, когда пользователь нажимает на элемент в представлении списка, подробная информация об элементе открывается на новой вкладке, затем пользователь может просмотреть подробную информацию, нажав на эту вкладку . я хочу, чтобы пользователь мог закрыть (уничтожить) эту вкладку сведений об одном из элементов? (помните, что он создается динамически)
как я могу удалить (закрыть) TabItem нажатием кнопки в этом фрагменте TabItem?
Пожалуйста, помогите мне, заранее благодарю вас.

Ответ №1:

Не рекомендуется изменять горизонтальную навигацию, добавляя другой фрагмент. Если это не требуется вашему клиенту, создайте новый фрагмент и просто замените текущий следующим образом:

 Fragment detailsFragment=new ContactsFragment()
getSupportFragmentManager.beginTransaction()
    .addToBackStack("tag")
    .replace(R.id.containerName, detailsFragment, "another_tag")
    .commit()
 

В вашем DetailsFragment просто вызовите ClickListener вашей кнопки закрытия getActivity.getSupportFragmentManager.popBackStack()
, и он восстановит предыдущее состояние.
Надеюсь, я смогу вам помочь.

Комментарии:

1. я добавил решение, но есть странная проблема, я не могу удалить TabItem , когда я нахожусь на этой вкладке!! программа вылетает. но я могу вызвать свой close_tabitem() метод из меню или когда я на другом tabitem

Ответ №2:

Я решил свою проблему с помощью :

во-первых) создание интерфейса в UserDetailFragment , который вы все знаете для общения MainActivity , я должен был это сделать.

но для чего мне нужно было общаться с MainActivity ? Ответ: как вы видите в моем коде, там определен мой класс FragmentPagerAdapter , и мне нужен был мой public List<Fragment> fragments = new ArrayList<>(); и public static List<String> fragmentsTitle = new ArrayList<>(); что я сохранил в них свои фрагменты, а также mytabLayout .

Во-вторых) я должен был определить tabLayout.addOnTabSelectedListener(){} с помощью своего метода OnTabSelected() , мне это было нужно, потому что я получаю текущий индекс вкладки, используя addOnTabSelectedListener(){} .

В-третьих) я определил removeTabPage(int position) в FragmentPagerAdapter .

Далее) я создал метод, как показано ниже (который является реализацией абстрактного метода UserDetailFragment интерфейса.

 @Override
    public void close_tabitem() {
        tabLayout.removeTabAt(tabposition_number);
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        Adapter.removeTabPage(tabposition_number);
        Adapter.notifyDataSetChanged();
    }
 

и вот весь мой код для: MainActivity.Java

 public class MainActivity extends AppCompatActivity implements ContactsFragment.CallBacks, UserDetailFragment.DetailCallBacks {

    android.support.v7.widget.Toolbar toolbar;

    public static List<Fragment> fragments = new ArrayList<>();
    public static List<String> fragmentsTitle = new ArrayList<>();
    ViewPager viewPager;
    TabLayout tabLayout;
    int tabposition_number;

    public List<Fragment> getFragments() {
        return fragments;
    }

    public List<String> getFragmentsTitle() {
        return fragmentsTitle;
    }

    public void addToFragments(Fragment fragment) {
        fragments.add(fragment);
    }

    public void addToFragmentsTitle(String title) {
        fragmentsTitle.add(title);
    }

    public Fragment getFragmentsWithPosition(int position) {
        return fragments.get(position);
    }

    public String getFragmentsTitleWithPosition(int position) {
        return fragmentsTitle.get(position);
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page_drawer);
        this.tabLayout = findViewById(R.id.tab_layout);
        this.viewPager = findViewById(R.id.view_pager);
        tabLayout.setupWithViewPager(viewPager);
        SetUpViewPager(viewPager);
        this.toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        NavigationView navigationView = findViewById(R.id.navigation_view);
        navigationView.setItemIconTintList(null);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){

            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                tabposition_number = tab.getPosition();
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    }

    public void SetUpViewPager(ViewPager viewPager) {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter((getSupportFragmentManager()));
        Adapter.AddFragmentPage(new SignInFragment(),"ورود");
        Adapter.AddFragmentPage(new ContactsFragment(),"ارتباطات");
        Adapter.AddFragmentPage(new RegisterFragment(),"ثبت نام");

        viewPager.setAdapter(Adapter);
    }

    @Override
    public void send_user_object(UserObject userObject) {
//        tabLayout.removeTabAt(tabposition_number);
//        myViewPagerAdapter.remove

    }

    @Override
    public void create_user_detail_tab(UserObject userObject) {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        UserDetailFragment userDetailFragment = new UserDetailFragment();
        Bundle bundle = new Bundle();
        bundle.putString("name",userObject.getName());
        bundle.putString("family",userObject.getFamily());
        bundle.putString("email",userObject.getEmail());
        userDetailFragment.setArguments(bundle);
        Adapter.AddFragmentPage(userDetailFragment,userObject.getName());
        viewPager.setAdapter(Adapter);
    }

    @Override
    public void close_tabitem() {
        tabLayout.removeTabAt(tabposition_number);
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        Adapter.removeTabPage(tabposition_number);
        Adapter.notifyDataSetChanged();
    }

    public class MyViewPagerAdapter extends FragmentPagerAdapter {


        public MyViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        public void removeTabPage(int position) {
                fragments.remove(position);
                fragmentsTitle.remove(position);
                notifyDataSetChanged();
        }

        public void AddFragmentPage(Fragment frag,String title) {
            MainActivity.this.addToFragments(frag);
            MainActivity.this.addToFragmentsTitle(title);
        }

        public Fragment getItem(int position) {
            return MainActivity.this.getFragmentsWithPosition(position);
        }

        public CharSequence getPageTitle(int position) {
            return MainActivity.this.getFragmentsTitleWithPosition(position);
        }


        public int getCount() {
            List<Fragment> frag = MainActivity.this.getFragments();
            return frag.size();
        }
    }



}

 

и вот тот UserDetailFragment.Java , который действует как мой TabItem :

 public class UserDetailFragment extends Fragment {

    View view;
    DetailCallBacks detailCallBacks;

    public UserDetailFragment() {}

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.user_detail_fragment,null);
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Button closebtn = view.findViewById(R.id.detail_close_button);
        closebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                detailCallBacks.close_tabitem();
            }
        });
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        detailCallBacks = (DetailCallBacks)context;
    }

    public interface DetailCallBacks {
        public void close_tabitem();
    }

}
 

Надеюсь, это вам поможет.
Но помните, вы не можете использовать это button . поместите кнопку в какой-либо другой tabitem или в menu .

или вы можете использовать :

 TabLayout.Tab tab = tabLayout.getTabAt(2);
tab.select();
 

чтобы изменить tabitem, а затем запустить событие.
наслаждайтесь…..