【问题标题】:in android how to put exit or close button on tabitems of an android tablayout在android中如何在android tablayout的tabitems上放置退出或关闭按钮
【发布时间】:2019-09-05 20:26:00
【问题描述】:

我有一个带有 TabLayout 的 android 应用程序,我创建 TabItems 并将它们分配给我的 TabLayout 在我的 MainActivity 中使用代码动态分配给我的 Fragments 之一,这是 Fragment 的 @ 987654326@,我有一个按钮。我想要的是当单击该按钮时,其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();
        }
    }



}

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

【问题讨论】:

    标签: android android-fragments android-tablayout tabitem


    【解决方案1】:

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

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

    在您的 detailsFragment 中,您的关闭按钮的 clickListener 只需调用 getActivity.getSupportFragmentManager.popBackStack() 并恢复以前的状态。 希望能帮到你。

    【讨论】:

    • 我已经添加了一个解决方案,但是有一个奇怪的问题,当我在那个标签上时,我无法删除TabItem!程序崩溃。但我可以调用我的 close_tabitem() 方法,从菜单或当我在另一个 tabitem
    【解决方案2】:

    我解决了我的问题:

    首先)在UserDetailFragment中创建一个接口,你们都知道与MainActivity通信,我必须这样做。

    但是我需要与MainActivity 交流什么? 答:正如您在我的代码中看到的那样,我的 FragmentPagerAdapter 类是在那里定义的,我需要我的 public List&lt;Fragment&gt; fragments = new ArrayList&lt;&gt;();public static List&lt;String&gt; fragmentsTitle = new ArrayList&lt;&gt;(); 已将我的片段保存到其中,还需要 mytabLayout

    其次)我必须用它的方法OnTabSelected() 定义tabLayout.addOnTabSelectedListener(){},我需要它,因为我使用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();
    

    更改 tabitem 然后触发事件。 享受.....

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多