【问题标题】:Why is ((MainActivity) getActivity()) giving me a NullPointerException?为什么 ((MainActivity) getActivity()) 给我一个 NullPointerException?
【发布时间】:2018-01-13 18:13:29
【问题描述】:

直升机,

我有以下代码:

EventPopup.java

class EventPopup extends Dialog {

private boolean delete;
private boolean edit;
private boolean editall;

private ReadEvent event;

... }

DayFragment.java(这是一个片段)

final EventPopup eventpopup = new EventPopup(getContext(), readevent);

            eventpopup.show();

            eventpopup.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialogInterface) {

                    if(eventpopup.getDelete()) {
                        ((MainActivity) getActivity()).refreshViewPager();
                    } else if (eventpopup.getEdit()) {
                        ((MainActivity) getActivity()).doEditEvent(readevent, eventpopup.getEditAll());
                    }
                }
            });

MainActivity.java:

public void refreshViewPager() {
    doubleViewPager.getAdapter().notifyDataSetChanged();
}

为什么这一行有时会在某些设备上给出 NullPointerException(在其他设备上不会)?:

                    ((MainActivity) getActivity()).refreshViewPager();

错误信息是:

java.lang.NullPointerException:

在 de.ubik.terminkalender.DayFragment$8$1.onDismiss (DayFragment.java:1378)

在 android.app.Dialog$ListenersHandler.handleMessage (Dialog.java:1749)

在 android.os.Handler.dispatchMessage (Handler.java:102)

在 android.os.Looper.loop (Looper.java:154)

在 android.app.ActivityThread.main (ActivityThread.java:6692)

在 java.lang.reflect.Method.invoke(本机方法)

在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468)

在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)

我有以下结构:MainActivity (with viewpager) -> DayFragment (as a Fragment) -> Dialog.当我关闭对话框时,我想检查对话框中是否单击了按钮。单击后,在 MainActivity 中刷新 viewpager。如何实现?

【问题讨论】:

    标签: java android nullpointerexception


    【解决方案1】:

    onDismiss.

    这意味着您的对话框被解除,它与您的 Activity 分离,这意味着 getActivity() 将返回 null。最好找到另一种方法来刷新 viewpager。你如何做到这一点取决于你为什么要提神。

    【讨论】:

    • 我有以下结构:MainActivity (with viewpager) -> DayFragment (as a Fragment) -> Dialog.当我关闭对话框时,我想检查对话框中是否单击了按钮。单击后,在 MainActivity 中刷新 viewpager。如何做到这一点?
    • 与其拥有“refreshViewpager”回调,不如拥有“buttonClicked”回调。该对话框将告诉 Activity 该按钮已被单击。然后 Activity 将关闭对话框并自行刷新。
    【解决方案2】:

    正如@Deev 所提到的,你总是会得到一个空值,解决方案是从一些以 getActivity 作为参数的方法调用你的对话框。

    示例代码:

     //call this from your fragment 
     showDialog(getActivity());
    

    并在您的片段中将其放置在某个地方

    public void showDialog(final Activity activity){
        final EventPopup eventpopup = new EventPopup(activity, readevent);
            eventpopup.show();
            eventpopup.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialogInterface) {
    
                    if(eventpopup.getDelete()) {
                        ((MainActivity)activity).refreshViewPager();
                    } else if (eventpopup.getEdit()) {
                        ((MainActivity) activity).doEditEvent(readevent, eventpopup.getEditAll());
                    }
                }
            });
    }
    

    这肯定会奏效。

    【讨论】:

    • 好的,我试试
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2022-11-24
    • 1970-01-01
    • 2013-11-06
    • 2014-01-24
    • 2019-07-21
    • 2010-10-17
    • 2013-06-18
    相关资源
    最近更新 更多