Soru & Cevap

Fragment içinde ViewPager + SwipeTabs ...

19.06.2014 - 09:23

Merhaba arkadaşlar iyi calısmalar herkese.Bir activity üstünde 2 fragmenti programlama taraflı değiştiriyorum lazım oldukça.Default olarak viewpageri barındıran fragmenti onCreatede yüklüyorum şu şekilde.

[code]

MainScreenFragment mainScreenFragment = new MainScreenFragment();
        android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.fragment_container,mainScreenFragment);
        ft.commit();

[/code]

bunda bir sorun yok viewpagerli sayfa ekrana gelip cuk diye oturuyor.Daha sonra kişi actionbar üzerinden search yaptığında üç harf girdiğinde sunucuya talepte bulunuyorum arama sonucu için o esnadada fragmenti değiştiriyorum bundada sorun fragment değişiyor.

[code]

 if(str.length()==3){
            mainScreenController.sendSearchUserPacket(str);

            SearchUserFragment searchUserFragment = new SearchUserFragment();
            android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container,searchUserFragment);
            getSupportFragmentManager().popBackStack();
            ft.commit();
            getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        }

[/code]

sonra aramayla işim bitiyor diyelim.tekrar MainScreenFragmente dönmek istiyorum bu yüzden şu kodu yazıyorum.

[code]

else if(str.length()==0){
            getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            MainScreenFragment mainScreenFragment = new MainScreenFragment();
            android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container,mainScreenFragment);
            ft.commit();
            getSupportFragmentManager().popBackStack();
            mSearchView.setIconified(true);
        }

[/code]

tekrarda mainscreen fragmenti yüklüyor buradada bir problem yok fakat tabları fazladan ekliyor.

yani başta viewpagerde 2 tab vardı Favori | Yakın Zamanda diye.geri döndüğümde şu hali alıyor

Favori | Yakın Zamanda | Favori | Yakın Zamanda | .... n gibi.

fragmentlerin tam olarak calısma mantıgını anlayamadım sayfada ekranı kaplamış bi framelayout var ve bu fragmentler ona yükleniyor.

3 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-1372-1408467635.jpg
ahmtbrk
19.06.2014 - 09:33

Buraya sormanın uğurlu bi yanı var sonucu kendim buluyorum :) kısaca şöyle söyleyim benim 1 activity üstünde koşan 2 tane fragmentim var.Activity adı MainScreenActivity fragment adları ise MainScreenFragment ve SearchUserFragment.

Daha sonra bu MainScreenFragmentte iki tab'dan oluşan viewpager barındırıyor.ActionBar ile ilgili her türlü ayarı bu sayfada yapıyorum.

[code]

       actionBar = getActivity().getActionBar();
        String[] mainScreenTabs = new String[]{"Favori Kullanıcılar","Yakın Zamanda"};


        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        for(String mainScreenTab : mainScreenTabs){
            if(mainScreenTab.equals("Favori Kullanıcılar")){
                actionBar.addTab(actionBar.newTab().setIcon(R.drawable.favorite).setText(mainScreenTab).setTabListener(this));
            }else if(mainScreenTab.equals("Yakın Zamanda")){
                actionBar.addTab(actionBar.newTab().setIcon(R.drawable.clock).setText(mainScreenTab).setTabListener(this));
            }
        }

        ViewPager mainScreenPager = (ViewPager)view.findViewById(R.id.mainScreenPager);
        mainScreenTabsPagerAdapter = new MainScreenTabsPagerAdapter(getChildFragmentManager(),mainScreenTabs);
        mainScreenPager.setAdapter(mainScreenTabsPagerAdapter);

[/code]

yani kısaca nested fragmentlerde ( iç içe) bu şekilde actionBar 'a müdahale edilebiliyor.

onDestroy bloğundada şunu yazıp sorunu düzelttim.

[code]

@Override
    public void onDestroy() {
        actionBar.removeAllTabs();
        super.onDestroy();
    }

[/code]