Android 如何在使用dagger 2时将数据传递给子片段
我想将一些数据从片段父对象传递给对话框片段子对象。问题是我无法通过bundle传递数据,因为dagger实例化了片段对话框,所以bundle总是空的。我用的是匕首2.12 我是匕首2的新手,所以这可能是件小事。我仍在努力想办法解决这个问题 我遵循教程,并采用它来适应我的应用。为了简单起见,这里是我的主要片段:Android 如何在使用dagger 2时将数据传递给子片段,android,android-fragments,dagger-2,Android,Android Fragments,Dagger 2,我想将一些数据从片段父对象传递给对话框片段子对象。问题是我无法通过bundle传递数据,因为dagger实例化了片段对话框,所以bundle总是空的。我用的是匕首2.12 我是匕首2的新手,所以这可能是件小事。我仍在努力想办法解决这个问题 我遵循教程,并采用它来适应我的应用。为了简单起见,这里是我的主要片段: public class MainFragment extends BaseFragment { @Nullable @Override public View
public class MainFragment extends BaseFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
this.setHasOptionsMenu(true);
return inflater.inflate(R.layout.my_fragment, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.my_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.action_delete:
Bundle args = new Bundle();
args.putString("BUNDLE_TITLE_KEY", getResources().getString(R.string.dialog_delete_name));
args.putString("BUNDLE_MESSAGE_KEY", getResources().getString(R.string.delete_message));
addDialogFragment(new ConformationFragmentDialog(), args);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}
public class BaseFragment extends Fragment implements HasFragmentInjector {
@Inject
@Named(BaseFragmentModule.CHILD_FRAGMENT_MANAGER)
FragmentManager childFragmentManager;
@Inject
DispatchingAndroidInjector<Fragment> childFragmentInjector;
@Override
public void onAttach(Context context) {
AndroidInjection.inject(this);
super.onAttach(context);
}
@Override
public AndroidInjector<Fragment> fragmentInjector() {
return childFragmentInjector;
}
protected final void addDialogFragment(DialogFragment dialogFragment, Bundle bundle) {
dialogFragment.setArguments(bundle);
childFragmentManager.beginTransaction().add(dialogFragment, "Hello").commit();
}
}
下面是BaseFragment(由MainFragment扩展):
以下是BaseFragmentModule和MainFragmentModule:
@Module
public abstract class BaseFragmentModule {
public static final String FRAGMENT = "BaseFragmentModule.fragment";
public static final String CHILD_FRAGMENT_MANAGER = "BaseFragmentModule.ChildFragmentManager";
@Provides
@Named(CHILD_FRAGMENT_MANAGER)
static FragmentManager childFragmentManager(@Named(FRAGMENT) Fragment fragment) {
return fragment.getChildFragmentManager();
}
}
@Module(includes = BaseFragmentModule.class, subcomponents = ConformationFragmentDialogSubcomponent.class)
public abstract class MainFragmentModule {
@Binds
@IntoMap
@FragmentKey(ConformationFragmentDialog.class)
abstract AndroidInjector.Factory<? extends Fragment> conformationFragmentDialog(ConformationFragmentDialogSubcomponent.Builder builder);
@Binds
@Named(BaseFragmentModule.FRAGMENT)
abstract Fragment fragment(UvjetListFragment uvjetListFragment);
}
@模块
公共抽象类BaseFragmentModule{
公共静态最终字符串FRAGMENT=“BaseFragmentModule.FRAGMENT”;
公共静态最终字符串CHILD\u FRAGMENT\u MANAGER=“BaseFragmentModule.ChildFragmentManager”;
@提供
@命名(子片段管理器)
静态碎片管理器子碎片管理器(@Named(FRAGMENT)FRAGMENT FRAGMENT){
返回fragment.getChildFragmentManager();
}
}
@模块(包括=BaseFragmentModule.class,子组件=FragmentDialogSubComponent.class)
公共抽象类MainFragmentModule{
@束缚
@英托马普
@FragmentKey(FragmentDialog.class)
抽象androidjector.Factory在ConfirmationFragmentDialog类中使用静态newInstance创建一个片段,如下所示
public class ConformationFragmentDialog extends DialogFragment {
public static ConformationFragmentDialog newInstance(String title,String msg) {
ConformationFragmentDialog fragment = new ConformationFragmentDialog();
// Supply string input as an argument.
Bundle args = new Bundle();
args.putString("BUNDLE_TITLE_KEY", title);
args.putString("BUNDLE_MESSAGE_KEY", msg);
fragment.setArguments(args);
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String title = getArguments.getStrings("BUNDLE_TITLE_KEY");
String message = getArguments.getStrings("");
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder.setNegativeButton(
R.string.common_odustani,
new DialogInterface.OnClickListener() {
//TODO: set title and message dynamically, bundle is null
}
).setTitle("TITLE").setMessage("MESSAGE");
return dialogBuilder.create();
}
}
对于MainFragment,也可以通过调用newInstance方法返回fragment。否,我正在将这些键传递到bundle中,是的,但无法检索它们,因为bundle为null,在运行时不存在bundle实例。这部分代码目前没有用。我留下它只是为了显示我正在尝试执行的操作。如果我尝试检索从bundle中的任何内容,我都会得到NullPointerException。您可以这样做来获取bundle中的数据。您的评论让我找到了正确的答案。问题是我没有获得正确的bundle。我试图从bundlesavedInstanceState
中获取参数,而不是使用getArguments()
方法。如上所述,savedInstanceState
在调用onSaveInstanceState
时可用。编辑您的答案以反映这一点,我将接受它。感谢@Miljac的输入。
public class ConformationFragmentDialog extends DialogFragment {
public static ConformationFragmentDialog newInstance(String title,String msg) {
ConformationFragmentDialog fragment = new ConformationFragmentDialog();
// Supply string input as an argument.
Bundle args = new Bundle();
args.putString("BUNDLE_TITLE_KEY", title);
args.putString("BUNDLE_MESSAGE_KEY", msg);
fragment.setArguments(args);
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String title = getArguments.getStrings("BUNDLE_TITLE_KEY");
String message = getArguments.getStrings("");
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder.setNegativeButton(
R.string.common_odustani,
new DialogInterface.OnClickListener() {
//TODO: set title and message dynamically, bundle is null
}
).setTitle("TITLE").setMessage("MESSAGE");
return dialogBuilder.create();
}
}