【问题标题】:Attempt to invoke virtual method when displaying TOAST? [duplicate]显示 TOAST 时尝试调用虚拟方法? [复制]
【发布时间】:2025-12-17 11:20:03
【问题描述】:

当您单击我的活动中的按钮时,它会启动/显示DatePickerDialog。当用户选择日期并单击“确定”时,我想在原始类(单击按钮的活动)中运行 AsyncTask。一切正常,但我想在 AsyncTask 完成时向用户显示一个 TOAST,但这样做时它不断收到错误。

这是我的代码:

BuyerHomePage.java 中的按钮方法

    public void MeetingCreator(){
        CalenderImageButton =     (ImageButton)findViewById(R.id.CalenderImageButton);
    CalenderImageButton.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                                DialogFragment picker = new DatePickerFragment();
                                picker.show(getFragmentManager(), "datePicker");
           }
        }
    );
}

DatePickerFragment.java 代码

 public class DatePickerFragment extends DialogFragment
    implements DatePickerDialog.OnDateSetListener {

public static String formattedDate;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
    final Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);

// Create a new instance of DatePickerDialog and return it
    return new DatePickerDialog(getActivity(), this, year, month, day);
}

@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
    Calendar c = Calendar.getInstance();
    c.set(year, month, day);

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    formattedDate = sdf.format(c.getTime());

    BuyerHomePage Meeting = new BuyerHomePage();
    Meeting.new MeetingSender().execute();
}
}

BuyerHomePage.java(AsyncTask 中的 post 方法)

@Override
    protected void onPostExecute (String result){

        if (result.equals("email sent")) {
            //This is where i get the error
            Toast.makeText(BuyerHomePage.this, "Email sent!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(BuyerHomePage.this, "Can't send email", Toast.LENGTH_LONG).show();
        }
    }

错误日志:

04-23 02:25:31.631 22071-22071/com.wilsapp.wilsapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wilsapp.wilsapp, PID: 22071
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
    at android.content.ContextWrapper.getResources(ContextWrapper.java:87)
    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81)
    at android.widget.Toast.<init>(Toast.java:102)
    at android.widget.Toast.makeText(Toast.java:259)
    at com.wilsapp.wilsapp.BuyerHomePage$MeetingSender.onPostExecute(BuyerHomePage.java:930)
    at com.wilsapp.wilsapp.BuyerHomePage$MeetingSender.onPostExecute(BuyerHomePage.java:836)
    at android.os.AsyncTask.finish(AsyncTask.java:651)
    at android.os.AsyncTask.-wrap1(AsyncTask.java)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    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)

如果有任何困惑或我需要解释任何事情,请发表评论!谢谢!

【问题讨论】:

  • 是BuyerHomePage 片段还是活动?
  • @MD 这是一个活动
  • BuyerHomePage 显然是Activity。您不能用new 实例化Activity,因为它没有有效的Context
  • 当用户从对话框中单击“确定”时,如何启动“AsyncTask”? @MikeM。
  • 您应该创建一个 interface 来实现您的 Activity,您的 DialogFragment 使用该 ActivityonDateSet() 方法回调到 Activity,并在Activityinterface 方法。 Here's 一个一般的例子。

标签: java android android-fragments android-asynctask android-dialogfragment


【解决方案1】:

试试这个。

Toast.makeText(getApplicationContext(), "Email sent!", Toast.LENGTH_LONG).show();

【讨论】:

  • 没有工作 :( 嗯,很高兴看到开发人员回家!
  • BuyerHomePage.java 是活动还是片段?
  • 这是一项活动!
  • 好的,看起来你想在非活动活动中烤面包。你应该在 DatePickerFragment.java...