繁体   English   中英

获取DialogFragment视图

[英]Getting view of DialogFragment

我创建了具有自定义布局的Dialog Fragment,并希望为某些文本框设置文本。 但是,当尝试在我的适配器映像中获取视图时,我遇到了空指针异常。

我想知道有什么最佳的实施方法吗?

提前致谢。

下面是我的代码:

public class AlertDialogFragment extends DialogFragment
{
    private View dialogView;
    private static IDialogButtonsClicks buttonsClicks;
    private AlertDialog.Builder alertDialog;

    public static AlertDialogFragment newInstance(int title, int icon, int positive, int negative, int view, int message, IDialogButtonsClicks clicks)
    {
        AlertDialogFragment dialogFragment = new AlertDialogFragment();

        Bundle args = new Bundle();
        args.putInt("title", title);
        args.putInt("icon", icon);
        args.putInt("pos", positive);
        args.putInt("neg", negative);
        args.putInt("view", view);
        args.putInt("message", message);

        buttonsClicks = clicks;

        dialogFragment.setArguments(args);

        return dialogFragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        alertDialog = new AlertDialog.Builder(getActivity());

        int dView = getArguments().getInt("view");
        int mess = getArguments().getInt("message");

        if (dView != -1)
        {
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
            dialogView = layoutInflater.inflate(dView, null);

            alertDialog.setView(dialogView);
        }

        if (mess != -1)
        {
            alertDialog.setMessage(mess);
        }

        alertDialog.setTitle(getArguments().getInt("title"));
        alertDialog.setIcon(getArguments().getInt("icon"));

        alertDialog.setPositiveButton(getArguments().getInt("pos"), new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                buttonsClicks.OnPositiveButtonClick(dialogView);
            }
        });

        alertDialog.setNegativeButton(getArguments().getInt("neg"), new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                buttonsClicks.OnNegativeButtonClick();
            }
        });

        return alertDialog.create();
    }

    public View getDialogView()
    {
        return dialogView;
    }

    @Nullable
    @Override
    public View getView()
    {
        return super.getView();
    }
}



holder.imgCatEdit.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialogFragment editCatDialog = AlertDialogFragment.newInstance(R.string.add_category_title, R.drawable.ic_edit, R.string.edit_cat_button_save, R.string.edit_cat_button_cancel, R.layout.edit_category, -1, new IDialogButtonsClicks()
                {
                    @Override
                    public void OnPositiveButtonClick(View view)
                    {

                    }

                    @Override
                    public void OnNegativeButtonClick()
                    {

                    }
                });

                editCatDialog.show(((MyBusinessMainActivity)baseContext).getSupportFragmentManager(), "EditCatDialog");

                View dialogView = editCatDialog.getView();//It seems here I'm getting null

                EditText ed_edit_cat_name = (EditText)dialogView.findViewById(R.id.ed_edit_cat_name);
                EditText ed_edit_cat_descr = (EditText)dialogView.findViewById(R.id.ed_edit_cat_descr);

                ed_edit_cat_name.setText(cat_name);
                ed_edit_cat_descr.setText(cat_descr);
            }
        });





11-23 12:40:49.708 19702-19702/am.nkr.mybusiness E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: am.nkr.mybusiness, PID: 19702
                                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                       at am.nkr.mybusiness.CategoriesAdapter$2.onClick(CategoriesAdapter.java:165)
                                                                       at android.view.View.performClick(View.java:5198)
                                                                       at android.view.View$PerformClick.run(View.java:21147)
                                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这是因为当您执行editCatDialog.getView(); 该视图尚未初始化(未调用onCreateDialog() )。

最好的方法是在onViewCreated方法的对话框中添加侦听器。 然后将这些事件传递到您的主要片段(例如,通过buttonClicks变量)。

如果您想以一种快速而笨拙的方式制作它,可以在show方法之后编写getSupportFragmentManager().executePendingTransaction()

是的,您收到了该错误,因为调用ed_edit_cat_name.setText(cat_name); ,您的DialogFragment回调onCreateView尚未完成! 为了克服这个问题,我觉得你可以声明一些变量来保存你的cat_namecat_desDialogFragment如下:

public class AlertDialogFragment extends DialogFragment
{
     private String catName;// getter - setter 
     private String catDes;//getter-setter
     // TODO: find your view and set cat name, description in onCreateView callback.
}

然后,您可以在创建DialogFragment新实例时设置猫的名称cat des。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM