Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 输入ViewModelProvider.Factory,我得到一个空指针异常_Java_Android_Android Fragments - Fatal编程技术网

Java 输入ViewModelProvider.Factory,我得到一个空指针异常

Java 输入ViewModelProvider.Factory,我得到一个空指针异常,java,android,android-fragments,Java,Android,Android Fragments,我相信我正在遵循为建立ViewModelProvider.Factory而提供给我的代码示例。它发生在OnAttach方法的CheckInRecentList代码中的该语句上。如果您能提供任何帮助,我们将不胜感激 mViewModel=新的ViewModelProvider(这是viewModelFactory).get(MainViewModel.class) 获取如下所示的空指针异常 02-01 06:08:08.319 22068-22068/com.example.checkingin

我相信我正在遵循为建立ViewModelProvider.Factory而提供给我的代码示例。它发生在OnAttach方法的CheckInRecentList代码中的该语句上。如果您能提供任何帮助,我们将不胜感激

mViewModel=新的ViewModelProvider(这是viewModelFactory).get(MainViewModel.class)

获取如下所示的空指针异常

02-01 06:08:08.319 22068-22068/com.example.checkingin I/Constraints: onAttach: OnAttach
02-01 06:17:22.773 22068-22068/com.example.checkingin D/AndroidRuntime: Shutting down VM
02-01 06:17:22.773 22068-22068/com.example.checkingin E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.checkingin, PID: 22068
    java.lang.NullPointerException: Attempt to invoke interface method 'androidx.lifecycle.ViewModel androidx.lifecycle.ViewModelProvider$Factory.create(java.lang.Class)' on a null object reference
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at com.example.checkingin.CheckInRecentList.onAttach(CheckInRecentList.java:117)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2669)
        at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:229)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1215)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1240)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1123)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2117)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2075)
        at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1946)
        at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
        at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:238)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733)
        at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:95)
        at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1556)
        at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:803)
        at android.view.View.measure(View.java:18788)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:18788)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
        at android.view.View.measure(View.java:18788)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
        a
CheckInRecentList.java

package com.example.checkingin;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProvider.Factory;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;

import static androidx.constraintlayout.widget.Constraints.TAG;

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link CheckInRecentList.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link CheckInRecentList#newInstance} factory method to
 * create an instance of this fragment.
 */
public class CheckInRecentList extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private RecyclerView recyclerView;
    private RecyclerView.Adapter checkInListAdapter;
    //private RecyclerView.LayoutManager layoutManager;
    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private MainViewModel mViewModel;
    private CheckInListAdapter adapter;
    private MainViewModelProviderFactory viewModelFactory;
    private TextView checkInLastDateTime;
    private TextView checkInTitle;
    private TextView checkInDestinationName;
    private TextView checkInComments;

    private OnFragmentInteractionListener mListener;

    public CheckInRecentList() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment CheckInRecentList.
     */
    // TODO: Rename and change types and number of parameters
    public static CheckInRecentList newInstance(String param1, String param2) {
        CheckInRecentList fragment = new CheckInRecentList();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    //      These were originally set up from the recycler view add to the fragment
    //          recyclerView = findViewById(R.id.check_in_recent_recycler_view);

                // use this setting to improve performance if you know that changes
                // in content do not change the layout size of the RecyclerView
                //recyclerView.setHasFixedSize(true);
/*
                // use a linear layout manager
                layoutManager = new LinearLayoutManager(this);
                recyclerView.setLayoutManager(layoutManager);
*/
                // specify an adapter (see also next example)
                //checkInListAdapter = new CheckInListAdapter();
     //           recyclerView.setAdapter(checkInListAdapter);
            }

   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_check_in_recent_list, container, false);
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {

        super.onAttach(context);

        Log.i(TAG, "onAttach: OnAttach");

        mViewModel = new ViewModelProvider(this, viewModelFactory).get(MainViewModel.class);

        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Log.i(TAG, "onActivityCreated: OnCreateView");

        //mViewModel = new ViewModelProvider(this, viewModelFactory).get(MainViewModel.class);

        checkInLastDateTime = getView().findViewById(R.id.checkInLastDateTime);
        checkInTitle = getView().findViewById(R.id.checkInTitle);
        checkInDestinationName = getView().findViewById(R.id.checkInDestinationName);
        checkInComments = getView().findViewById(R.id.checkInComments);

        listenerSetup();
        observerSetup();
        recyclerSetup();
    }
    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
    private void clearFields() {
        checkInLastDateTime.setText("");
        checkInDestinationName.setText("");
        checkInTitle.setText("");
        checkInComments.setText("");
    }

    private void listenerSetup() {

        Button editCheckInButton = getView().findViewById(R.id.checkInEditButton);
        Button resendCheckInButton = getView().findViewById(R.id.checkInResendButton);

        editCheckInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
        //put in edit check in logic
            }
        });
        resendCheckInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
        //put in resend logic
            }
        });

        }

    private void observerSetup() {

        mViewModel.getAllCheckIn().observe(getViewLifecycleOwner(), new Observer<List<CheckInTable>> ()
{
            @Override
            public void onChanged(@Nullable final List<CheckInTable> checkIn) {
                adapter.setCheckInList(checkIn);
            }
        });

        mViewModel.getSearchCheckInResults().observe(getViewLifecycleOwner(), new Observer<List<CheckInTable>>() {
            @Override
            public void onChanged(@Nullable final List<CheckInTable> checkIn) {

                        if (checkIn.size() > 0) {

                            checkInLastDateTime.setText(checkIn.get(0).getCheckInLastDateTime());
                            checkInDestinationName.setText(checkIn.get(0).getCheckInDestinationName());
                            checkInTitle.setText(checkIn.get(0).getCheckInTitle());
                            checkInComments.setText(checkIn.get(0).getCheckInComments());
                        } else {
                            checkInLastDateTime.setText("None Found");
                        }
                    }
                });
    }
    private void recyclerSetup() {

        RecyclerView recyclerView;

        adapter = new CheckInListAdapter(R.layout.recycler_view_item);
        recyclerView = getView().findViewById(R.id.check_in_recent_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(adapter);
    }
}

package com.example.checkingin;
导入android.content.Context;
导入android.net.Uri;
导入android.os.Bundle;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModelProvider;
导入androidx.lifecycle.ViewModelProvider.Factory;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.widget.TextView;
导入java.util.List;
导入静态androidx.constraintlayout.widget.Constraints.TAG;
/**
*一个简单的{@link Fragment}子类。
*包含此片段的活动必须实现
*{@link CheckInRecentList.OnFragmentInteractionListener}接口
*处理交互事件。
*使用{@link CheckInRecentList#newInstance}工厂方法
*创建此片段的实例。
*/
公共类CheckInRecentList扩展了片段{
//TODO:重命名参数参数,选择匹配的名称
//片段初始化参数,例如ARG_ITEM_NUMBER
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私有静态最终字符串ARG_PARAM2=“PARAM2”;
私人回收站;
private RecyclerView.Adapter checkInListAdapter;
//private RecyclerView.LayoutManager LayoutManager;
//TODO:重命名和更改参数类型
私有字符串mParam1;
私有字符串mParam2;
私有主视图模型mViewModel;
专用CheckInListAdapter适配器;
私有MainViewModelProviderFactory viewModelFactory;
私有文本视图checkInLastDateTime;
私有文本视图检查;
私有文本视图checkInDestinationName;
私有文本视图检查注释;
私有OnFragmentInteractionListener mListener;
公共签入最近列表(){
//必需的空公共构造函数
}
/**
*使用此工厂方法创建的新实例
*使用提供的参数创建此片段。
*
*@param param1参数1。
*@param param2参数2。
*@返回片段CheckInRecentList的新实例。
*/
//TODO:重命名和更改参数的类型和数量
公共静态CheckInRecentList newInstance(字符串参数1,字符串参数2){
CheckInRecentList片段=新的CheckInRecentList();
Bundle args=新Bundle();
args.putString(ARG_PARAM1,PARAM1);
args.putString(ARG_PARAM2,PARAM2);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
//这些最初是从“回收者”视图中设置的,添加到片段中
//recyclerView=findViewById(R.id.check\u在最近的\u recycler\u视图中);
//如果您知道这些更改,请使用此设置提高性能
//在内容中,不要更改RecyclerView的布局大小
//recyclerView.setHasFixedSize(true);
/*
//使用线性布局管理器
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
*/
//指定适配器(另请参见下一个示例)
//checkInListAdapter=新的checkInListAdapter();
//recyclerView.setAdapter(checkInListAdapter);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
返回充气机。充气(R.layout.fragment\u check\u in\u recent\u list,container,false);
}
//TODO:重命名方法、更新参数并将方法挂接到UI事件中
public void onButtonPressed(Uri){
if(mListener!=null){
onFragmentInteraction(uri);
}
}
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
Log.i(标签“onAttach:onAttach”);
mViewModel=新的ViewModelProvider(这是viewModelFactory).get(MainViewModel.class);
if(OnFragmentInteractionListener的上下文实例){
mListener=(OnFragmentInteractionListener)上下文;
}否则{
抛出新的RuntimeException(context.toString()
+“必须实现OnFragmentInteractionListener”);
}
}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
i(标记“onActivityCreated:OnCreateView”);
//mViewModel=新的ViewModelProvider(这是viewModelFactory).get(MainViewModel.class);
checkInLastDateTime=getView().findViewById(R.id.checkInLastDateTime);
checkinttle=getView().findViewById(R.id.checkinttle);
checkInDestinationName=getView().findViewById(R.id.checkInDestinationName);
checkInComments=getView().findViewById(R.id.checkInComments);
listenerSetup();
observer设置();
回收设置();
}
@凌驾
package com.example.checkingin;

import android.app.Application;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

import static androidx.constraintlayout.widget.Constraints.TAG;

public class MainViewModelProviderFactory implements ViewModelProvider.Factory {
    private final Application mDataSource;

    public MainViewModelProviderFactory(Application dataSource) {
        mDataSource = dataSource;

    }

    @Override
    @NonNull
    public <T extends ViewModel>
        T create(@NonNull Class<T> modelClass) {
        Log.i(TAG, "MainViewModelProviderFactory: ");
        if (modelClass.isAssignableFrom(MainViewModel.class)) {
            Log.i(TAG, "create: is assignable");
            return (T) new MainViewModel(mDataSource);
        }
        //noinspection unchecked
        throw new IllegalArgumentException("Unknown ViewModel class");
    }}
package com.example.checkingin;
import android.app.Application;
import android.util.Log;

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.util.List;

import static androidx.constraintlayout.widget.Constraints.TAG;

public class MainViewModel extends AndroidViewModel {

    private CheckInRecipientsTableRepository checkInRecipientsTableRepository;
    private LiveData<List<CheckInRecipientsTable>> allRecipients;
    private MutableLiveData<List<CheckInRecipientsTable>> searchRecipientResults;

    private ContactGroupsTableRepository contactGroupsTableRepository;
    private LiveData<List<ContactGroupsTable>> allContactGroups;
    private MutableLiveData<List<ContactGroupsTable>> searchContactGroupsResults;

    private CheckInTableRepository checkInTableRepository;
    private LiveData<List<CheckInTable>> allCheckIn;
    private MutableLiveData<List<CheckInTable>> searchCheckInResults;

    public MainViewModel (Application application) {
        super(application);
        Log.i(TAG, "MainViewModel: In the Main View Model");
        checkInRecipientsTableRepository = new CheckInRecipientsTableRepository(application);
        allRecipients = checkInRecipientsTableRepository.getAllCheckInRecipients();
        searchRecipientResults = checkInRecipientsTableRepository.getSearchRecipientResults();

        checkInTableRepository = new CheckInTableRepository(application);
        allCheckIn = checkInTableRepository.getAllCheckIn();
        searchCheckInResults = checkInTableRepository.getSearchCheckInResults();

        contactGroupsTableRepository = new ContactGroupsTableRepository(application);
        allContactGroups = contactGroupsTableRepository.getAllContactGroups();
        searchContactGroupsResults = contactGroupsTableRepository.getSearchContactGroupsResults();
    }


    MutableLiveData<List<CheckInRecipientsTable>> getSearchRecipientResults() {
        return getSearchRecipientResults();
    }
    LiveData<List<CheckInRecipientsTable>> getAllCheckInRecipients() {
        return getAllCheckInRecipients();
    }

    public void insertCheckInRecipientsTable(CheckInRecipientsTable checkInRecipientsTable) {
        checkInRecipientsTableRepository.insertCheckInRecipientsTable(checkInRecipientsTable);
    }
    public void deleteCheckInRecipient(int checkInPrimaryKey) {
        checkInRecipientsTableRepository.deleteCheckInRecipient(checkInPrimaryKey);
    }
    public void findCheckInRecipient(int checkInPrimaryKey) {
        checkInRecipientsTableRepository.findCheckInRecipient(checkInPrimaryKey);
    }


    MutableLiveData<List<ContactGroupsTable>> getSearchContactGroupsResults() {
        return getSearchContactGroupsResults();
    }
    LiveData<List<ContactGroupsTable>> getAllContactGroups() {
        return getAllContactGroups();
    }

    public void insertContactGroupsTable(ContactGroupsTable contactGroupsTable) {
        contactGroupsTableRepository.insertContactGroups(contactGroupsTable);
    }
    public void deleteContactGroups(int contactGroupsTablePrimaryKey) {
        contactGroupsTableRepository.deleteContactGroups(contactGroupsTablePrimaryKey);
    }
    public void findContactGroups(int contactGroupsTablePrimaryKey) {
        contactGroupsTableRepository.findContactGroups(contactGroupsTablePrimaryKey);
    }

    MutableLiveData<List<CheckInTable>> getSearchCheckInResults() {
        return getSearchCheckInResults();
    }
    LiveData<List<CheckInTable>> getAllCheckIn() {
        return getAllCheckIn();
    }

    public void insertCheckInTable(CheckInTable checkInTable) {
        checkInTableRepository.insertCheckIn(checkInTable);
    }
    public void deleteCheckIn(int checkInTablePrimaryKey) {
        checkInTableRepository.deleteCheckIn(checkInTablePrimaryKey);
    }
    public void findCheckIn(int checkInTablePrimaryKey) {
        checkInTableRepository.findCheckIn(checkInTablePrimaryKey);
    }
}
private MainViewModelProviderFactory viewModelFactory;

// Note that it is better to use onCreate or onCreateView for initialization.   
// Since your ViewModel usually should be alive at a time, when `onAttach` is called.
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    viewModelFactory = new MainViewModelProviderFactory(context.getApplicationContext());
    mViewModel = new ViewModelProvider(this, viewModelFactory).get(MainViewModel.class);

}
private final Context mDataSource;

public MainViewModelProviderFactory(Context appContext) {
    mDataSource = appContext;
}
viewModelFactory = new MainViewModelProviderFactory((Application)context.getApplicationContext());