2017-01-29 7 views
-2

У моего приложения есть фрагментАктивность с tabBar, который управляет плейером представления и содержит 3 фрагмента, когда я обновляю свой класс User в fragmentB, мне нужно отобразить его в fragmentC. мой вопрос в том, как обновить fragmentC каждый раз, когда я добавляю нового пользователя.Обновить фрагмент в FragmentActivity

, прежде чем я написал этот вопрос я пытался все решения из этого вопросы:

1. Update ViewPager dynamically?

2. refresh fragment at reload

Update Fragment from ViewPager 3.

4. ViewPager PagerAdapter not updating the View

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

вот мой код

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

} 

ответ

0

Найдено решение:

я использовал в методе onPageSelected, когда позиция 2 мой фрагмент открепление, а затем присоединить фрагмент. работает отлично!

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

Вы можете создать обратный вызов, как:

public interface UserChangedCallback{ 
    void onUserChanged(); 
} 

и реализовать эту функцию обратного вызова на каждом представлении/фрагменте, где вы хотите получить доступ к пользователю:

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

Зарегистрируйте обратный вызов в usermanager через UserManager.getInstance().registerCallback(this). Внутри usermanager необходимо добавить обратный вызов во внутренний список.

Создание собственной функции внутри usermanager:

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

Если добавить/изменить/удалить пользователя, вы всегда должны вызывать эту функцию в конце. Например:

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

Теперь каждое представление будет уведомлено и обновлено.

Важно!

Не забудьте отменить регистрацию обратного вызова от usermanager на onDestroy(), чтобы избежать утечек памяти.

+0

я вроде нового в Android вы можете объяснить мне, как зарегистрировать функцию обратного вызова –

+0

Создать публичную функцию в вашем UserManager 'общественного недействительного RegisterCallback (UserChangedCallback обратного вызова);' и вызвать эту функцию в 'OnCreate() 'вашего взгляда – beeb

+0

' public void registerCallback (UserChangedCallback callback) {registeredCallbacks.add (callback);} '.... если мне нужно сделать это, я получаю nullpointer –