首页 > 解决方案 > 当我重建项目时出现错误:不兼容的类型:ModalEvent 无法转换为上下文

问题描述

但是当我编码它时,请单击链接查看图像。顺便说一句,这是一个inflateLayout,当我单击 modal_event.xml 中的按钮(btnDateTime)时,它将显示一个 DatePickerDialog。ModalEvent.java 不是我的主要活动。ModalEvent.java 仅在我单击 NavigationView 中的项目时显示...请帮助我需要你们所有人:) 我的 ModalEvent.java 中的这段代码

package com.example.khalessi_jb.reminderapplication;
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import java.util.Calendar;


public class ModalEvent extends BottomSheetDialogFragment {

TextView txtDateandTime;
Button btnsDateTime;

Calendar calendar;
DatePickerDialog datePickerDialog;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    btnsDateTime = (Button) getView().findViewById(R.id.btnDateTime);
    txtDateandTime =(TextView)getView().findViewById(R.id.txtDateTime);

    View v = inflater.inflate(R.layout.modal_event,container,false);

    return v;


    btnsDateTime.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
           calendar = Calendar.getInstance();
            int daysss = calendar.get(Calendar.DAY_OF_MONTH);
            int monthss =calendar.get(Calendar.MONTH);
            int yearss =calendar.get(Calendar.YEAR);

            datePickerDialog = new DatePickerDialog(ModalEvent.this, new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int mYear, int mMonth, int mDay) {
                    txtDateandTime.setText(mDay +"/" + (mMonth +1)+"/"+mYear);
                }
            },yearss,monthss,daysss);
            datePickerDialog.show();
        }
    });


}

}

这是我的 modal_event.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="16dp">


<TextView
android:id="@+id/textView12"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Event" />

<EditText
android:id="@+id/txtEventName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView12"
android:layout_centerHorizontal="true"
android:ems="10"
android:hint="Event Title"
android:inputType="textLongMessage" />

<EditText
android:id="@+id/txtWhere"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView15"
android:layout_alignStart="@+id/textView13"
android:ems="10"
android:hint="Event Location"
android:inputType="textLongMessage" />

<TextView
android:id="@+id/textView13"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtEventName"
android:layout_alignStart="@+id/txtEventName"
android:layout_marginTop="-1dp"
android:text="When" />

<TextView
android:id="@+id/txtDateTime"
android:layout_width="148dp"
android:layout_height="wrap_content"
android:layout_below="@+id/textView13"
android:layout_alignStart="@+id/textView12"
android:layout_marginStart="182dp"
android:layout_marginTop="15dp"
android:ems="10"
android:hint="Date/Time"
android:inputType="time"
android:textSize="15dp" />

<TextView
android:id="@+id/textView15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView10"
android:layout_alignStart="@+id/textView13"
android:layout_marginStart="4dp"
android:text="Where" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/textView12"
android:layout_alignParentEnd="true"
android:layout_marginTop="216dp"
android:layout_marginEnd="132dp"
android:text="Create" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/button"
android:layout_alignParentEnd="true"
android:layout_marginTop="-1dp"
android:layout_marginEnd="15dp"
android:text="Close" />

<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/txtDateTime"
android:layout_alignParentStart="true"
android:layout_marginStart="0dp"
android:layout_marginEnd="21dp"
android:layout_toStartOf="@+id/txtDateTime"
android:text="at" />

<TextView
android:id="@+id/textView14"
android:layout_width="124dp"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/button"
android:layout_alignParentTop="true"
android:layout_marginStart="96dp"
android:layout_marginTop="378dp" />

<Button
android:id="@+id/btnDateTime"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_below="@+id/textView13"
android:layout_alignParentStart="true"
android:layout_marginStart="-4dp"
android:text="Choose Date/Time" />

</RelativeLayout>

当我单击按钮时,此显示在 logcat

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
    at com.example.khalessi_jb.reminderapplication.ModalEvent.onCreateView(ModalEvent.java:30)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:836)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:203)
    at android.app.ActivityThread.main(ActivityThread.java:6259)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

标签: android

解决方案


您需要传递getContext()getActivity()而不是ModalEvent.this作为 DatePickerDialog 的第一个参数。您的代码如下所示:

datePickerDialog = new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int mYear, int mMonth, int mDay) {
                txtDateandTime.setText(mDay +"/" + (mMonth +1)+"/"+mYear);
            }
        },yearss,monthss,daysss);

试试看,让我知道

似乎该部分有效,现在您只需要在 onCreateView 方法中进行一些重构:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.modal_event,container,false);
    btnsDateTime = (Button) v.findViewById(R.id.btnDateTime);
    txtDateandTime =(TextView)v.findViewById(R.id.txtDateTime);

    btnsDateTime.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view){
       calendar = Calendar.getInstance();
        int daysss = calendar.get(Calendar.DAY_OF_MONTH);
        int monthss =calendar.get(Calendar.MONTH);
        int yearss =calendar.get(Calendar.YEAR);

        datePickerDialog = new DatePickerDialog(ModalEvent.this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int mYear, int mMonth, int mDay) {
                txtDateandTime.setText(mDay +"/" + (mMonth +1)+"/"+mYear);
            }
        },yearss,monthss,daysss);
        datePickerDialog.show();
    }
    });

   return v;
}

推荐阅读