Android удаляет предыдущий значок вкладки, когда я создаю новый динамически - PullRequest
0 голосов
/ 18 апреля 2019

я создаю 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);

вот мой код для создания нового TabItems в TabLayout

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);
        }

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

, чтобы решить эту проблему, для нединамических мы можем просто написать

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]);
        }

Я надеюсь, это поможет вам.Также ознакомьтесь с моим решением для создания динамических вкладок, которые пользователь может добавлять или удалять по этой ссылке: не может изменить tabItem (происходит сбой программы), когда я удаляю один из моих tabItems с кодом и не забывайтедать большой палец вверх :).удачи ...

0 голосов
/ 18 апреля 2019

При вызове myViewPagerAdapter.notifyDataSetChanged(); воссоздаются все вкладки, поэтому все значки удаляются.

Последняя вставленная вкладка может содержать значок, поскольку вы устанавливаете значение после notifyDataSetChanged.

Итак, попробуйте реализовать функцию восстановления всех значков после каждой новой вставки.

Можно сохранить все ресурсы значков в массиве до AddFragmentPage, а затем восстановить их.

...