【问题标题】:Refresh Fragment in FragmentActivity刷新 FragmentActivity 中的 Fragment
【发布时间】:2017-01-31 06:17:54
【问题描述】:

我的应用程序有一个带有 tabBar 的 fragmentActivity,它控制视图寻呼机并包含 3 个片段,当我在 fragmentB 中更新我的类 User 时,我需要在 fragmentC 中显示他。 我的问题是每次添加新用户时如何刷新fragmentC

在我写这个问题之前,我尝试了这个问题的所有解决方案:

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)?

这是我的代码

片段活动:

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

片段B:

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

片段C:

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

}

【问题讨论】:

    标签: android android-fragments android-fragmentactivity


    【解决方案1】:

    您可以创建如下回调:

    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.getInstance().registerCallback(this)在用户管理器上注册回调。在内部,用户管理器必须将回调添加到内部列表。

    在你的用户管理器中创建一个私有函数:

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

    如果你添加/修改/删除一个用户,你总是必须在最后调用这个函数。例如:

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

    现在每个视图都会收到通知并刷新。

    重要!

    不要忘记在onDestroy() 上取消注册用户管理器的回调以避免内存泄漏。

    【讨论】:

    • 我是android的新手,你可以向我解释如何注册回调
    • 在您的 UserManager public void registerCallback(UserChangedCallback callback); 中创建一个公共函数并在您的视图的 onCreate() 中调用此函数
    • public void registerCallback(UserChangedCallback callback){registeredCallbacks.add(callback);} ....如果我需要这样做,我会得到空指针
    • 在你的用户管理器的私有构造函数中初始化registeredCallbacks
    • 我找到了解决方案,但非常感谢您的尝试:)
    【解决方案2】:

    找到解决方案:

    我在方法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) {
    
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多