2017-01-29 1 views
-2

Meine App haben eine FragmentActivity mit TabBar, die Kontrolle über die Ansicht Pager und enthalten 3 Fragmente, wenn ich meine Klasse User in fragmentB aktualisieren, muss ich ihn in fragmentC anzeigen. meine Frage ist, wie zu aktualisieren fragmentC jedes Mal, wenn ich neue Benutzer hinzufügen.Fragment in FragmentActivity aktualisieren

, bevor ich schrieb diese Frage, die ich all die Lösung aus dieser Fragen versucht:

1. Update ViewPager dynamically?

2. refresh fragment at reload

3. Update Fragment from ViewPager

4. ViewPager PagerAdapter not updating the View

5. How to update fragment content from activity (viewpager)?

hier ist mein Code

FragmentActivity:

public class MainActivityTab extends FragmentActivity { 


    public SectionsPagerAdapter mSectionsPagerAdapter; 
    public ViewPager mViewPager; 
    public static MainActivityTab instance = null; 


    public static MainActivityTab getInstance(){ 
     return instance; 
    } 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_tab); 
     getWindow().setStatusBarColor(Color.rgb(191,76,12)); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
     mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
     final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 
     tabLayout.getTabAt(0).setIcon(R.drawable.icon_A); 
     tabLayout.getTabAt(1).setIcon(R.drawable.icon_B); 
     tabLayout.getTabAt(2).setIcon(R.drawable.icon_C); 
     mViewPager.setCurrentItem(1,false); 
    } 

FragmentStatePagerAdapter:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position){ 
       case 0: 
        return FragmentA.newInstance(); 
       case 1: 
        return FragmentA.newInstance(); 
       case 2: 
        return FragmentC.newInstance(); 
       default: 
        return null; 
      } 
     } 

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return null; 
     } 
    } 

FragmentB:

public class FragmentB extends Fragment { 

    EditText name; 
    EditText age; 
    Button btnSave; 

    public static FragmentB newInstance() { 
     FragmentB fragment = new FragmentB(); 
     return fragment; 
    } 
    public FragmentB() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_new2, container, false); 
     name = (EditText) rootView.findViewById(R.id.name); 
     age = (EditText) rootView.findViewById(R.id.age); 
     btnSave = (Button) rootView.findViewById(R.id.btnSave); 
     btnSave.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       UserManager.getInstance().creteUser(name.getText().toString(),age.getText().toString()); 
      } 
     }); 
     return rootView; 
    } 
} 

FragmentC:

public interface UserChangedCallback{ 
    void onUserChanged(); 
} 

und implementieren diese Rückruf bei jeder Ansicht/Fragment, wo Sie den Benutzer zugreifen möchten:

public class FragmentC extends Fragment { 
    TextView nameTxt; 
    TextView ageTxt; 

    public static FragmentC newInstance(){ 
     FragmentC instance = new FragmentC(); 
     return instance; 
    } 
    public FragmentC(){ 

    } 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_new3, container, false); 
    nameTxt = (TextView) rootView.findViewById(R.id.nameTxt); 
    ageTxt = (TextView) rootView.findViewById(R.id.ageTxt); 
    showUser(); 
    return rootView; 
    } 
    public void showUser(){ 

     if(UserManager.getInstance().getUser().getName()!=null){ 
      nameTxt.setText(UserManager.getInstance().getUser().getName().toString()); 
      ageTxt.setText(UserManager.getInstance().getUser().getAge().toString()); 
     } 
    } 

} 

Antwort

0

gefunden Lösung:

i in dem Verfahren verwendet onPageSelected, wenn die Position 2 mein Fragment detach ist und danach das Fragment befestigen. funktioniert perfekt!

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
       @Override 
       public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

       } 

       @Override 
       public void onPageSelected(int position) { 
        if(position==2){ 
         FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().add(R.id.fragmant_new3, FragmentC.newInstance()); 
         fragmentTransaction.detach(FragmentC.newInstance()); 
         fragmentTransaction.attach(FragmentC.newInstance()); 
         fragmentTransaction.commit(); 

        } 
       } 

       @Override 
       public void onPageScrollStateChanged(int state) { 

       } 
      }); 
0

Sie einen Rückruf wie schaffen könnte

@Override 
public void onUserChanged() { 
    adapter.notifyDataSetChanged(); 
    // or if you don't have an adapter refresh your textfields or whatever you want 
} 

Registrieren Sie den Rückruf am UserManager über UserManager.getInstance().registerCallback(this). Intern muss der Usermanager den Callback zu einer internen Liste hinzufügen.

Erstellen Sie eine private Funktion in Ihrem Usermanager:

private void notifyCallbacks() { 
    for(UserChangedCallback callback : registeredCallbacks) { 
    callback.onUserChanged(); 
    } 
} 

Wenn Sie Hinzufügen/Ändern/Löschen eines Benutzers, den Sie immer diese Funktion am Ende verlangen. Zum Beispiel:

public void addUser(User user) { 
    users.add(user); 
    notifiCallbacks(); 
} 

Jetzt wird jede Ansicht benachrichtigt und aktualisiert.

Wichtig!

Vergessen Sie nicht, den Rückruf vom usermanager auf onDestroy() abzumelden, um Speicherlecks zu vermeiden.

+0

Ich bin ein bisschen neu in Android du mir erklären kann, wie den Rückruf registrieren –

+0

eine öffentliche Funktion in Ihrem Usermanager erstellen 'public void register (UserChangedCallback Rückruf);' und rufen Sie diese Funktion in 'onCreate() 'Ihrer Sicht – beeb

+0

' public void registerCallback (UserChangedCallback Callback) {registeredCallbacks.add (Callback);} '.... wenn ich so etwas tun muss, bekomme ich nullpointer –

Verwandte Themen