【问题标题】:android removes previous tab icon , when i create new one dynamicallyandroid删除以前的标签图标,当我动态创建新的
【发布时间】:2019-09-08 17:20:04
【问题描述】:

我动态创建TabItems,并分配新选项卡创建了一个图标,但问题是:当我再次动态创建另一个选项卡时,以前的TabItem 图标消失了!为什么:(?

这是我没有动态创建新标签时的图片:

https://drive.google.com/file/d/1C80e-Yldlu6asL2H_vCIbwH7cY7Farpn/view?usp=sharing

这是我用图标创建另一个图像时的图像:

https://drive.google.com/file/d/1i-IXudvYayLf9mGhBGQmyCkjeVkN3xXs/view?usp=sharing

你可以看到区别:(。

使用图标创建前三个动态tabitems 的代码如下:

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.setupWithViewPager(viewPager);
        tabLayout.getTabAt(0).setIcon(R.drawable.lock);
        tabLayout.getTabAt(1).setIcon(R.drawable.contacts);
        tabLayout.getTabAt(2).setIcon(R.drawable.info);

这是我在TabLayout 中创建新TabItems 的代码

public void create_user_detail_tab(UserObject userObject) {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        UserDetailFragment userDetailFragment = new UserDetailFragment();
        // the code for AddFragmentPage would be in the next session , i'll paste it's function for you
        Adapter.AddFragmentPage(userDetailFragment,userObject.getName());
        byte[] decodedString = Base64.decode(userObject.getImage(),Base64.NO_WRAP);
        InputStream inputStream  = new ByteArrayInputStream(decodedString);
        Bitmap bitmap  = BitmapFactory.decodeStream(inputStream);
        Bitmap circleBitmap = CircleBitmapConverter.makeCircle(bitmap);
        Drawable d = new BitmapDrawable(getResources(), circleBitmap);
        tabLayout.getTabAt(tabs_number).setIcon(d);
        // tabs_number is number of tabs wich are not changing not dynamic
        TabLayout.Tab tab = tabLayout.getTabAt(tabs_number);
        tab.select();
        // i increase the number of tabs present each time a new one is created ( pretty logical )
        tabs_number++;
    }

这是 AddFragmentPage(我在之前的代码中说过,如果需要的话,我会为你包含它的代码:

public void AddFragmentPage(Fragment frag,String title) {
            addToFragments(frag);
            addToFragmentsTitle(title);
            MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
            myViewPagerAdapter.notifyDataSetChanged();
            viewPager.setAdapter(myViewPagerAdapter);
        }

【问题讨论】:

    标签: android dynamic-programming android-tablayout tabitem android-icons


    【解决方案1】:

    myViewPagerAdapter.notifyDataSetChanged(); 的调用将重新创建所有选项卡,因此所有图标都将被删除。

    最后插入的选项卡可以保留图标,因为您在 notifyDataSetChanged 之后设置值。

    所以,尝试实现一个函数,在每次新插入后恢复所有图标。

    您可以将AddFragmentPage之前的所有图标资源保存在一个数组中,然后恢复它们。

    【讨论】:

    • 这带来了另一个问题,你看我不仅动态创建了tabs,还让用户删除了tabs。那怎么办?当用户删除选项卡时。我怎么知道职位?无论如何,我必须知道重新分配他们的位置。前三个我已经做了你提出的解决方案。但对于动态的,这是不可能的,有没有办法解决这个问题?
    • 我查过,问题不在于notifyDataSetChanged,也不是notifyDataSetChange 导致了这个问题。我刚才检查了
    • 确实 notifyDatasetChange() 会删除图标,如果它在那里,我会放置它,是的,它删除了所有图标,但就我而言,我在不调用该方法的情况下添加,所以没有任何效果...
    • 你在AddFragmentPage中打电话给viewpager.notifyDataSetChange
    • @yes ,但我也删除了它,令我惊讶的是没有任何改变:| .所以我就像你说的那样创建了一个数组,但跟踪动态选项卡有点不同。
    【解决方案2】:

    为了解决这个问题,对于非动态的我们可以写

    tabLayout.getTabAt(0).setIcon(R.drawable.lock);
    tabLayout.getTabAt(1).setIcon(R.drawable.contacts);
    tabLayout.getTabAt(2).setIcon(R.drawable.info);
    

    但对于动态的,我们需要创建一个数组,该数组从我创建的变量 tabs_number 获取其计数器和可绘制对象的位置,因此每次用户添加或删除选项卡时,tabs_number 都会计算数量存在的标签,

    所以我们现在创建新标签并为其分配图标的内容如下:

    Drawable[] myUserIcons = new Drawable[10];
    
        @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);
            byte[] decodedString = Base64.decode(userObject.getImage(),Base64.NO_WRAP);
            InputStream inputStream  = new ByteArrayInputStream(decodedString);
            Bitmap bitmap  = BitmapFactory.decodeStream(inputStream);
            Bitmap circleBitmap = CircleBitmapConverter.makeCircle(bitmap);
            Drawable d = new BitmapDrawable(getResources(), circleBitmap);
            myUserIcons[tabs_number] = d;
            tabLayout.getTabAt(0).setIcon(R.drawable.lock);
            tabLayout.getTabAt(1).setIcon(R.drawable.contacts);
            tabLayout.getTabAt(2).setIcon(R.drawable.info);
            tabLayout.getTabAt(tabs_number).setIcon(d);
            if(tabs_number >= 3) {
                for(int i=tabs_number;i >= 3;--i)
                tabLayout.getTabAt(i).setIcon(myUserIcons[i]);
            }
    

    我希望这会对你有所帮助。还可以查看我的解决方案,用于创建用户可以在此链接添加或删除的动态选项卡: can't change the tabItem ( program crashes ) , when i delete one of my tabItems with code 并且不要忘记竖起大拇指:)。 祝你好运……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多