单击 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/