it-swarm.com.de

Wie kann ich ein Tag für Viewpager-Fragmente setzen?

Ich verwende SlideTabLayout mit 4 Registerkarten und einem Viewpager und 4 Fragmentklassen für jede Registerkarte. 

ich muss eines meiner Fragmente (erste Registerkarte) in meinem Projekt neu laden, wenn der Benutzer auf eine Schaltfläche klickt. Dafür brauche ich ein Tag für dieses Fragment

meine Frage ist: Wie kann ich ein Tag für ein Viewpagers-Fragment setzen?

Meine MainActivity-Registerkarte und Viewpager-Codes:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {



Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[]={"نوع","قیمت","برند","همه"};
int Numboftabs = 4;




@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);




    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "درج آگهی رایگان", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });



    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);




    // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
    adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);

    // Assigning ViewPager View and setting the adapter
    pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);

    // Assiging the Sliding Tab Layout View
    tabs = (SlidingTabLayout) findViewById(R.id.tabs);
    tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

    // Setting Custom Color for the Scroll bar indicator of the Tab View
    tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
        @Override
        public int getIndicatorColor(int position) {
            return getResources().getColor(R.color.colorWhite);
        }
    });

    // Setting the ViewPager For the SlidingTabsLayout
    tabs.setViewPager(pager);
    pager.setCurrentItem(3);




} and ....

Vielen Dank

13
K1-Aria

Dafür gibt es einige Lösungen. 

1). Wenn das FragmentPagerAdapter dem Fragment ein FragmentManager hinzufügt, verwendet es ein spezielles Tag, das auf der Position basiert, an der das Fragment platziert wird. So können Sie einfach das aktuell sichtbare Fragment in Ihrem ViewPager erhalten, indem Sie diese Codezeilen verwenden

 Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.pager + ":" + ViewPager.getCurrentItem());
 // based on the current position you can then cast the page to the correct Fragment class and call some method inside that fragment to reload the data:
 if (0 == ViewPager.getCurrentItem() && null != fragment) {
      ((TabFragment1)fragment).reloadFragmentData();     
 } 

2). Sie sollten alle aktiven Fragmente in FragmentStatePagerAdapter verfolgen. Demobeispiel können Sie auf den zweiten Ansatz hier beziehen.

3). Sie können EventBus verwenden, um Ereignisse von überall aus in Ihrem Fragment zu veröffentlichen. Alles, was Sie tun müssen, ist, Ihre Fragment für dieses bestimmte Ereignis zu registrieren. Für offizielle Dokumentation siehe this

26
Mukesh Rana

Hier ist die Methode, die von FragmentPagerAdapter verwendet wird, um den Tagnamen der Fragment zu erstellen:

private static String makeFragmentName(int viewId, long id) {
    return "Android:switcher:" + viewId + ":" + id;
}

viewId ist die ID der ViewPager.
id ist die Position des Fragments innerhalb der ViewPager.

Beispiel:

String fragmentTag = makeFragmentName(myViewPager.getId(), 2);
Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
7
vovahost

Obwohl diese Frage bereits beantwortet wurde. Ich habe einen anderen Ansatz, um dies zu erreichen, und dies könnte besser sein, da die Art und Weise, wie Fragmente im Code markiert werden, Änderungen unterworfen sind. Auch darauf hinzuweisen, dass mit adapter.getItem (position) die angezeigte Instanz des Fragments nicht zurückgegeben wird, hängt es von unserer eigenen Implementierung der getItem-Methode ab.

Grundsätzlich besteht das Problem darin, dass wir nicht die Instanz von Fragmenten haben, die im viewPager vorhanden sind. Die Idee ist, die Methode zu überschreiben 

public Object instantiateItem(ViewGroup container, int position) {
    // If we already have this item instantiated, there is nothing
    // to do.  This can happen when we are restoring the entire pager
    // from its saved state, where the fragment manager has already
    // taken care of restoring the fragments we previously had instantiated.
    if (mFragments.size() > position) {
        Fragment f = mFragments.get(position);
        if (f != null) {
            return f;
        }
    }

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }

    Fragment fragment = getItem(position);
    if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
    if (mSavedState.size() > position) {
        Fragment.SavedState fss = mSavedState.get(position);
        if (fss != null) {
            fragment.setInitialSavedState(fss);
        }
    }
    while (mFragments.size() <= position) {
        mFragments.add(null);
    }
    fragment.setMenuVisibility(false);
    fragment.setUserVisibleHint(false);
    mFragments.set(position, fragment);
    mCurTransaction.add(container.getId(), fragment);

    return fragment;
}

von FragmentStatePagerAdapter. Wenn wir die Standardimplementierung dieser Methode betrachten, werden im Wesentlichen neue Fragmente instanziiert, wenn sie nicht vorhanden sind, und sie zurückgegeben. Es speichert sie auch in einer Liste von Fragmenten, die privat ist. Wir können also diese Methode überschreiben und die Instanzen auf Fragmenten in unserer eigenen Liste speichern. Dies kann auf folgende Weise implementiert werden 

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    private ArrayList<Fragment> fragmentList;

    private final int NUM_PAGES;

    public ScreenSlidePagerAdapter(FragmentManager fm, int numPages) {
        super(fm);
        NUM_PAGES = numPages;
        fragmentList = new ArrayList<>(NUM_PAGES);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new CustomFragment();
        //this method can be modified according to the requirement
        return fragment;
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

    public Fragment getFragment(int position){
        return fragmentList.get(position);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position){
        Fragment fragment = (Fragment) super.instantiateItem(container,position);
        if(fragmentList.size()<NUM_PAGES&&!fragmentList.contains(fragment)){
            fragmentList.add(fragment);
        }
        return fragment;
    }
}

Daher haben wir die Instanzen aller bei uns verfügbaren Fragmente, wir brauchen keine Tags mehr, um die Fragment-Instanzen zu finden, die dem Benutzer angezeigt werden.

0
Utkarsh Saxena