如何从托管 Activity 重启 Fragment 的 LoaderManager?
How to restart Fragment's LoaderManager from hosting Activity?
我有一个主 activity 和一个带有两个选项卡的 ViewPager。每个选项卡包含一个片段。
其中一个片段包含一个 RecyclerView 和 FAB,在单击时显示一个 DialogFragment,允许用户将新项目添加到 RecyclerView。此片段还实现了 LoaderCallbacks 接口(RecyclerView 数据由 Cursors 支持):
public class MyListFragment extends Fragment
implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialog = SaveDialogFragment.newInstance();
dialog.show(getFragmentManager(), "SaveDialogFragment");
}
});
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
...
getLoaderManager().initLoader(0, null, this);
return view;
}
...
}
在这个 DialogFragment 中 class 我声明了一个接口用于 Positive 和 Negative 按钮的回调:
public class SaveDialogFragment extends DialogFragment {
...
public interface SaveDialogListener {
void onSaveDialogPositiveClick(String str1, String str2);
}
...
}
由于我使用 SaveDialogFragment.onAttach() 方法获取对此对话框托管的引用,因此我需要在 MainActivity(不在片段中)中实现 SaveDialogListener:
public class MainActivity extends AppCompatActivity implements SaveDialogFragment.SaveDialogListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mViewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(mViewPager);
TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
tabs.setupWithViewPager(mViewPager);
}
@Override
public void onSaveDialogPositiveClick(String name, String number) {
...
saveItem(new ItemRow(name, number));
// HERE I MUST RESET THE LOADER, BUT HOW???
// getLoaderManager().restartLoader(0, null, ???);
}
}
总而言之:我从一个片段启动一个 DialogFragment,当用户添加新项目时,这个 DialogFragment 会通知托管 Activity。
我的疑问来自于我在 Fragment 内部使用 LoaderManager(因为 Fragment 负责初始化 Loader 并重置它)。但是,当调用 onSaveDialogPositiveClick 时,Activity 如何重新启动 Fragment 的 Loader?
怎样处理这种情况才是最正确的?
由于 ViewPager 的适配器持有对片段的引用,因此在 activity 中保留对片段的引用似乎是错误的,只是为了重新启动 LoaderManager:
getLoaderManager().restartLoader(0, null, showListFragment);
提前致谢。
我会这样做,
使用方法创建了一个回调接口 SaveDialogListener。在调用片段 (MyListFragment) 中实现它。在 DialogFragment 创建期间,将调用片段 MyListFragment 设置为目标片段。使用此方法 dialogFrag.setTargetFragment(MyListFragment.this, 0)。现在您可以使用此接口将数据发送到您的片段。
在你的 DialogFragment class,
SaveDialogListener callback =
(SaveDialogListener) getTargetFragment();
callback. onSaveDialogPositiveClick(param1,param2);
注意:使用 getChildFragmentManager() 显示 DialogFragment。
这样您就可以在片段中获得回调。并且可以在那里重新加载 loadermanager。
我有一个主 activity 和一个带有两个选项卡的 ViewPager。每个选项卡包含一个片段。
其中一个片段包含一个 RecyclerView 和 FAB,在单击时显示一个 DialogFragment,允许用户将新项目添加到 RecyclerView。此片段还实现了 LoaderCallbacks 接口(RecyclerView 数据由 Cursors 支持):
public class MyListFragment extends Fragment
implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialog = SaveDialogFragment.newInstance();
dialog.show(getFragmentManager(), "SaveDialogFragment");
}
});
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
...
getLoaderManager().initLoader(0, null, this);
return view;
}
...
}
在这个 DialogFragment 中 class 我声明了一个接口用于 Positive 和 Negative 按钮的回调:
public class SaveDialogFragment extends DialogFragment {
...
public interface SaveDialogListener {
void onSaveDialogPositiveClick(String str1, String str2);
}
...
}
由于我使用 SaveDialogFragment.onAttach() 方法获取对此对话框托管的引用,因此我需要在 MainActivity(不在片段中)中实现 SaveDialogListener:
public class MainActivity extends AppCompatActivity implements SaveDialogFragment.SaveDialogListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mViewPager = (ViewPager) findViewById(R.id.viewPager);
setupViewPager(mViewPager);
TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
tabs.setupWithViewPager(mViewPager);
}
@Override
public void onSaveDialogPositiveClick(String name, String number) {
...
saveItem(new ItemRow(name, number));
// HERE I MUST RESET THE LOADER, BUT HOW???
// getLoaderManager().restartLoader(0, null, ???);
}
}
总而言之:我从一个片段启动一个 DialogFragment,当用户添加新项目时,这个 DialogFragment 会通知托管 Activity。
我的疑问来自于我在 Fragment 内部使用 LoaderManager(因为 Fragment 负责初始化 Loader 并重置它)。但是,当调用 onSaveDialogPositiveClick 时,Activity 如何重新启动 Fragment 的 Loader? 怎样处理这种情况才是最正确的?
由于 ViewPager 的适配器持有对片段的引用,因此在 activity 中保留对片段的引用似乎是错误的,只是为了重新启动 LoaderManager:
getLoaderManager().restartLoader(0, null, showListFragment);
提前致谢。
我会这样做, 使用方法创建了一个回调接口 SaveDialogListener。在调用片段 (MyListFragment) 中实现它。在 DialogFragment 创建期间,将调用片段 MyListFragment 设置为目标片段。使用此方法 dialogFrag.setTargetFragment(MyListFragment.this, 0)。现在您可以使用此接口将数据发送到您的片段。
在你的 DialogFragment class,
SaveDialogListener callback =
(SaveDialogListener) getTargetFragment();
callback. onSaveDialogPositiveClick(param1,param2);
注意:使用 getChildFragmentManager() 显示 DialogFragment。
这样您就可以在片段中获得回调。并且可以在那里重新加载 loadermanager。