共享首选项非活动分配给变量获取nullpointerexception

时间:2016-06-15 06:26:33

标签: java android sharedpreferences

我有一个非活动课,我想访问我保存在片段中的variables。我可以在其他片段/活动中使用这些prefs,因此它们正在工作。当我尝试在我的non_Activity类中将prefvalues分配给public class VorgangDataSource { Context mcontext; float lbcount; float rbcount; float bcount; SharedPreferences sharedPreferences; SharedPreferences sharedPreferences1; SharedPreferences sharedPreferences2; private static final String LOG_TAG = VorgangDataSource.class.getSimpleName(); public SQLiteDatabase database; private VorgangDbHelper dbHelper; private String[] columns = { VorgangDbHelper.COLUMN_ID, VorgangDbHelper.COLUMN_START, VorgangDbHelper.COLUMN_STOP, VorgangDbHelper.COLUMN_LEFTB, VorgangDbHelper.COLUMN_RIGHTB, VorgangDbHelper.COLUMN_BOTTLE }; public VorgangDataSource(Context context) { Log.d(LOG_TAG, "DataSource erzeugt dbHelper!"); dbHelper = VorgangDbHelper.getInstance(); this.mcontext = context; this.sharedPreferences = mcontext.getSharedPreferences("FILELB",Context.MODE_PRIVATE); this.sharedPreferences1 = mcontext.getSharedPreferences("FILERB",Context.MODE_PRIVATE); this.sharedPreferences2 = mcontext.getSharedPreferences("FILEBO",Context.MODE_PRIVATE); this.lbcount = sharedPreferences.getFloat("KEYLB",0); this.rbcount = sharedPreferences1.getFloat("KEYRB",0); this.bcount = sharedPreferences2.getFloat("KEYBO",0); } public void open() { Log.d(LOG_TAG, "Eine Referenz auf die Datenbank wird jetzt angefragt."); database = dbHelper.getWritableDatabase(); Log.d(LOG_TAG, "Datenbank-Referenz erhalten. Pfad zur Datenbank: " + database.getPath()); } public void close() { dbHelper.close(); Log.d(LOG_TAG, "Datenbank mit Hilfe des DbHelpers geschlossen."); } public VorgangDataSource open(boolean readOnly) throws SQLException { dbHelper = VorgangDbHelper.getInstance(); if(readOnly) database = dbHelper.getReadableDatabase(); else database = dbHelper.getWritableDatabase(); return this; } } 时,无论我改变了什么,我都会得到一个nullpointerexception(我已经在堆栈上阅读了多个主题,没有任何工作)。

06-15 08:28:47.816 12806-12806/com.example... E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example PID: 12806
                                                                                java.lang.NullPointerException
                                                                                    at com.example...VorgangDataSource.<init>(VorgangDataSource.java:169)
                                                                                    at com.example...frag_anzeigen.<init>(frag_anzeigen.java:53)
                                                                                    at com.example...MainActivity.onNavigationItemSelected(MainActivity.java:117)
                                                                                    at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:151)
                                                                                    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
                                                                                    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
                                                                                    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
                                                                                    at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:318)
                                                                                    at android.view.View.performClick(View.java:4748)
                                                                                    at android.view.View$PerformClick.run(View.java:19535)
                                                                                    at android.os.Handler.handleCallback(Handler.java:733)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                    at android.os.Looper.loop(Looper.java:146)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5679)
                                                                                    at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                    at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
                                                                                    at dalvik.system.NativeStart.main(Native Method)

错误日志:

public class frag_anzeigen 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";


    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;



    private static final String TAG = frag_anlegen.class.getSimpleName();
    private static final String FILENAME = TAG + ".kdf";
    private List valueList = new ArrayList <String>();
    final VorgangDataSource dataSource = new VorgangDataSource(getActivity());



    ArrayAdapter<vorgangsdaten> VorgangArrayAdapter;
    List<vorgangsdaten> vorgangsdatenList;

    public frag_anzeigen() {
        // 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 frag_anzeigen.
     */
    // TODO: Rename and change types and number of parameters
    public static frag_anzeigen newInstance(String param1, String param2) {
        frag_anzeigen fragment = new frag_anzeigen();
        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);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View anzeigen = inflater.inflate(R.layout.frag_anzeigen,container,false);


        anzeigen.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if(event.getAction()==MotionEvent.ACTION_DOWN)
                {
                    close();
                }
                return true;
            }
        });

        Log.d(TAG,"Die Datenquelle wird geöffnet!");

        dataSource.open();

        vorgangsdatenList = dataSource.getAllVorgangsDaten();

        VorgangArrayAdapter = new ArrayAdapter< >(getActivity(),R.layout.mylistlayout,vorgangsdatenList);

        final ListView lv = (ListView)anzeigen.findViewById(R.id.listView);
        lv.setAdapter(VorgangArrayAdapter);
        //lv.setItemsCanFocus(false);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, final long id) {
                String s_id = String.valueOf(id);
                Log.d(s_id,"id_in_onitem");

                String p_id = String.valueOf(position);
                Log.d(p_id,"position_on_item");

                final AlertDialog delete = new AlertDialog.Builder(getActivity()).create();
                delete.setTitle(getResources().getString(R.string.advice));
                delete.setMessage(getResources().getString(R.string.delete2dialog));
                delete.setIcon(R.drawable.warning);
                delete.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        vorgangsdatenList.remove(position);
                        dataSource.deleteRow(id);
                        VorgangArrayAdapter.notifyDataSetChanged();
                        Toast.makeText(getActivity(), getResources().getString(R.string.eventdeleted), Toast.LENGTH_SHORT).show();
                    }
                });
                delete.setButton(DialogInterface.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        delete.closeOptionsMenu();
                    }
                });
                delete.show();
            }
        });

        return anzeigen;
    }

    // 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);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @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);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    public void close (){
        FragmentManager fm = getFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        transaction.setCustomAnimations(R.anim.slide_in_up,R.anim.slide_out_up);
        transaction.remove(this);
        transaction.commit();
    }
}

片段级

html5lib

1 个答案:

答案 0 :(得分:1)

问题出在这一行

final VorgangDataSource dataSource = new VorgangDataSource(getActivity());

这里getActivity()返回null,因为如果尚未调用相应片段的onAttach。所以从那里删除该行并写入onAttach方法或片段类的onCreate方法。

希望这会对你有所帮助。