在android中如何将退出或关闭按钮放在android tablayout的tabitems上

时间:2019-04-15 19:42:21

标签: android android-fragments android-tablayout tabitem

我有一个带有TabLayout的android应用程序,我创建了TabItems并将它们通过我的MainActivity中的代码动态分配给我的TabLayout,位于我的Fragments之一中是Fragment的{​​{1}},我有一个按钮。我想要的是单击该按钮时,其TabItem关闭并销毁,我该如何实现? 额外的说明:下面是我的TabItem代码(我创建动态MainActivity.java的大部分代码都存在:

TabItems

在我的预定义选项卡之一中,我有一个列表视图,当用户单击列表视图上的某个项目时,该项目的详细信息会在新选项卡中打开,然后用户可以通过单击该选项卡来查看详细信息。我要的是用户如何关闭(销毁)其中一项的详细信息选项卡? (记住它是动态创建的) 如何通过单击TabItem片段中的按钮单击来删除(关闭)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(); } } } ? 请帮我,谢谢你。

2 个答案:

答案 0 :(得分:0)

通过添加另一个片段来更改水平导航不是一个好习惯。如果您的客户不是绝对需要它,请创建一个新片段,然后像这样替换当前片段:

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

根据您的详细信息片段,您关闭按钮的clickListener只需调用getActivity.getSupportFragmentManager.popBackStack() 并恢复以前的状态。 希望我能帮助您。

答案 1 :(得分:0)

我通过以下方式解决了我的问题:

首先)在UserDetailFragment中创建一个大家都知道与MainActivity进行通信的接口,我必须这样做。

但是我需要与MainActivity进行交流吗? 答:如您在我的代码中所见,我的FragmentPagerAdapter类在那里定义,我需要将片段保存到其中的public List<Fragment> fragments = new ArrayList<>();public static List<String> fragmentsTitle = new ArrayList<>();以及mytabLayout

第二个)我必须使用其方法tabLayout.addOnTabSelectedListener(){}来定义OnTabSelected(),因为我使用addOnTabSelectedListener(){}来获取标签的当前索引,所以我需要这样做。

第三)我在FragmentPagerAdapter中定义了removeTabPage(int position)

Forth),我创建了一个波纹管方法(它是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。将按钮放在其他tabitemmenu中。

或者您可以使用:

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

更改选项,然后触发事件。 享受.....