如何从 DialogFragment 中的 Fragment 获取数据?
How to get the data from a Fragment which is inside a DialogFragment?
我有一个 DialogFragment,它使用 FragmentPagerAdapter 来显示选项卡。每个选项卡都有一个使用 RecyclerView 的不同片段。我可以将单击的项目传递给片段,但是如何将数据从片段获取到 DialogFragment 以便将其传递给调用 Activity?
TabDialog 扩展了 DialogFragment:
public class TabDialog extends DialogFragment {
public interface OnCompleteListener{
void onCompleteListener(String test);
}
private OnCompleteListener mListener;
TabLayout tabLayout;
ViewPager viewPager;
FragmentTabPositive tabPositive = new FragmentTabPositive();
FragmentTabNegative tabNegative = new FragmentTabNegative();
TabAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getDialog().setCanceledOnTouchOutside(true);
View rootView = inflater.inflate(R.layout.dialog_layout, container, false);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabLayout1);
viewPager = (ViewPager) rootView.findViewById(R.id.masterViewPager);
adapter = new TabAdapter(getChildFragmentManager());
adapter.addFragment("Positive", tabPositive);
adapter.addFragment("Negative", tabNegative);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
return rootView;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
this.mListener = (OnCompleteListener)context;
} catch(ClassCastException e){
throw new ClassCastException(context.toString() +
" must Implement OnCompleteListener");
}
}
TabAdapter 扩展了 FragmentPagerAdapter
public class TabAdapter extends FragmentPagerAdapter {
List<Fragment> mFragmentCollection = new ArrayList<>();
List<String> mTitleCollection = new ArrayList<>();
public TabAdapter(FragmentManager fm){
super(fm);
}
public void addFragment(String title, Fragment fragment){
mTitleCollection.add(title);
mFragmentCollection.add(fragment);
}
@Override
public CharSequence getPageTitle(int position){
return mTitleCollection.get(position);
}
@Override
public int getCount(){
return mFragmentCollection.size();
}
@Override
public Fragment getItem(int position) {
return mFragmentCollection.get(position);
}
在 FragmentTabPos 的 onCreateView 里面
popupAdapter = new PopupAdapter(view.getContext(), list);
recyclerView.setAdapter(popupAdapter);
popupAdapter.setmListener(new PopupAdapter.OnPointClickedListener() {
@Override
public void OnItemClicked(String test) {
//This works
Toast.makeText(FragmentTabPositive.this.getContext(), test + " Inside FragTabPos", Toast.LENGTH_LONG).show();
}
});
为了避免将您的 Fragment 耦合得太紧,我个人会选择使用新架构组件传输该数据。
您可以使用 AndroidViewModel
来传递您的数据。
这是 Android 开发者网站上的介绍:https://developer.android.com/topic/libraries/architecture/index.html
或者,您可以使用事件总线 post 从一个片段到其父片段的数据。
一个这样的库:https://github.com/greenrobot/EventBus
使用架构组件的好处是它遵循 Google 的最新应用程序设计标准。
已解决:必须在 Fragment 中实现我自己的侦听器并在 DialogFragment 中触发它。从那里,我使用 OnCompleteListener 将数据传递回调用 Activity.
我有一个 DialogFragment,它使用 FragmentPagerAdapter 来显示选项卡。每个选项卡都有一个使用 RecyclerView 的不同片段。我可以将单击的项目传递给片段,但是如何将数据从片段获取到 DialogFragment 以便将其传递给调用 Activity?
TabDialog 扩展了 DialogFragment:
public class TabDialog extends DialogFragment {
public interface OnCompleteListener{
void onCompleteListener(String test);
}
private OnCompleteListener mListener;
TabLayout tabLayout;
ViewPager viewPager;
FragmentTabPositive tabPositive = new FragmentTabPositive();
FragmentTabNegative tabNegative = new FragmentTabNegative();
TabAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getDialog().setCanceledOnTouchOutside(true);
View rootView = inflater.inflate(R.layout.dialog_layout, container, false);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabLayout1);
viewPager = (ViewPager) rootView.findViewById(R.id.masterViewPager);
adapter = new TabAdapter(getChildFragmentManager());
adapter.addFragment("Positive", tabPositive);
adapter.addFragment("Negative", tabNegative);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
return rootView;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try{
this.mListener = (OnCompleteListener)context;
} catch(ClassCastException e){
throw new ClassCastException(context.toString() +
" must Implement OnCompleteListener");
}
}
TabAdapter 扩展了 FragmentPagerAdapter
public class TabAdapter extends FragmentPagerAdapter {
List<Fragment> mFragmentCollection = new ArrayList<>();
List<String> mTitleCollection = new ArrayList<>();
public TabAdapter(FragmentManager fm){
super(fm);
}
public void addFragment(String title, Fragment fragment){
mTitleCollection.add(title);
mFragmentCollection.add(fragment);
}
@Override
public CharSequence getPageTitle(int position){
return mTitleCollection.get(position);
}
@Override
public int getCount(){
return mFragmentCollection.size();
}
@Override
public Fragment getItem(int position) {
return mFragmentCollection.get(position);
}
在 FragmentTabPos 的 onCreateView 里面
popupAdapter = new PopupAdapter(view.getContext(), list);
recyclerView.setAdapter(popupAdapter);
popupAdapter.setmListener(new PopupAdapter.OnPointClickedListener() {
@Override
public void OnItemClicked(String test) {
//This works
Toast.makeText(FragmentTabPositive.this.getContext(), test + " Inside FragTabPos", Toast.LENGTH_LONG).show();
}
});
为了避免将您的 Fragment 耦合得太紧,我个人会选择使用新架构组件传输该数据。
您可以使用 AndroidViewModel
来传递您的数据。
这是 Android 开发者网站上的介绍:https://developer.android.com/topic/libraries/architecture/index.html
或者,您可以使用事件总线 post 从一个片段到其父片段的数据。
一个这样的库:https://github.com/greenrobot/EventBus
使用架构组件的好处是它遵循 Google 的最新应用程序设计标准。
已解决:必须在 Fragment 中实现我自己的侦听器并在 DialogFragment 中触发它。从那里,我使用 OnCompleteListener 将数据传递回调用 Activity.