Android 如何在使用dagger 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

我想将一些数据从片段父对象传递给对话框片段子对象。问题是我无法通过bundle传递数据,因为dagger实例化了片段对话框,所以bundle总是空的。我用的是匕首2.12

我是匕首2的新手,所以这可能是件小事。我仍在努力想办法解决这个问题

我遵循教程,并采用它来适应我的应用。为了简单起见,这里是我的主要片段:

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。我试图从bundle
savedInstanceState
中获取参数,而不是使用
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();
    }
}