android - 将数据从 Activity 发送到 Tab View fragment

标签 android android-fragments bundle android-fragmentactivity

单击 FloatingActionButton 时如何将数据从 Activity 发送到选项卡 fragment ,或者哪里弄错了,我该如何解决,我知道它已被问过很多次,我尝试了所有解决方案包括 this这个和this这给出了明确的解释,但仍然可以工作超过 20 小时,我没有错误,也没有任何效果。

//主要 Activity 中的 float 按钮

         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
   fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String  MyValue=" Hi fragment";
            Bundle bundle = new Bundle();
            bundle.putString("value", MyValue);
          // set Fragmentclass Arguments
            TabFragment1 fragobj = new TabFragment1();
            fragobj.setArguments(bundle);

        }
        });

//fragment 中

   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view =inflater.inflate(R.layout.tab_fragment_1, container, false);
     TextView textView= (TextView)view.findViewById(R.id.textView) ;
    if (getArguments() != null) {
        String MyValue = getArguments().getString("value");
        textView.setText(MyValue);
    }
    return view;
}

////这里是适配器

             public class PagerAdapter extends FragmentStatePagerAdapter {
      private final SparseArray<WeakReference<Fragment>> 
          instantiatedFragments = new SparseArray<>();
         private ArrayList<String> mTabHeader;
         int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            TabFragment1 tab1 = new TabFragment1();
            return tab1;
        case 1:
            TabFragment2 tab2 = new TabFragment2();
            return tab2;
        case 2:
            TabFragment3 tab3 = new TabFragment3();
            return tab3;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}
@Override
public Object instantiateItem(final ViewGroup container, final int position) {
    final Fragment fragment = (Fragment) super.instantiateItem(container, position);
    instantiatedFragments.put(position, new WeakReference<>(fragment));
    return fragment;
}

@Override
public void destroyItem(final ViewGroup container, final int position, final Object object) {
    instantiatedFragments.remove(position);
    super.destroyItem(container, position, object);
}

@Nullable
public Fragment getFragment(final int position) {
    final WeakReference<Fragment> wr = instantiatedFragments.get(position);
    if (wr != null) {
        return wr.get();
    } else {
        return null;
    }
}

@Override
public CharSequence getPageTitle(int position) {
    return mTabHeader.get(position);
}

最佳答案

首先,我假设您希望在每次按下 fab 时更新 fragment ,即使您的 fragment 已经在屏幕上。您的适配器每次都返回一个新 fragment ,您应该持有 fragment 实例并返回存储在数组中给定位置的 fragment 。 检查这个通用的 FragmentStatePagerAdapter:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private List<Fragment> mFragmentList = new ArrayList<>();
    private List<String> mFragmentTitleList = new ArrayList<>();


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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (!mFragmentTitleList.isEmpty()) {
            return mFragmentTitleList.get(position);
        }
        return "";
    }

}

然后在您的 fragment 上创建一个方法来更新您的信息:

public void updateData(String string){
    miTextView.setText(string);
}

最后在你的 Activity 上做这样的事情:

 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
 fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        YourFragment fragment = (YourFragment) adapter.getItem(desiredPosition);
        fragment.updateData("your string");
        }
    });

关于android - 将数据从 Activity 发送到 Tab View fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074072/

相关文章:

android - 即使更新到 RN 0.58.4,React native 溢出也无法在 android 中工作

android - 如何像uber android应用程序一样在 map 上获取居中位置图钉的位置

java - Android 发布/订阅单例示例

android - BaseActivity 中的工具栏

c# - asp.net mvc Bundle.IncludeDirectory 示例?

android - 带有 AndroidSDK API 19 及更低版本的 Xamarin.Android 的放大 float 操作按钮的阴影填充错误

android - 当文件大小大于可恢复上传 block 大小时,文档列表 API 文件上传失败

android - 如果当前 fragment 未知,如何导航到 fragment ?

java - OSGi getServiceReference 返回 null

java - OSGi 包和普通 .JAR 文件用法之间的区别