-1

I have a non activity class where I want to access my sharedpreferences I saved in a fragment. I can use these prefs in other fragments / activities, so they are working. When I try to assign the prefvalues to variables in my non_Activity class I always get a nullpointerexception no matter what I changed (I´ve read through mulitple topics here on stack on nothing worked).

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

Error Log:

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)

fragment-class

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();
    }
}
Patrick260284
  • 89
  • 1
  • 11

1 Answers1

1

The problem is in this line

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

Here getActivity() returns null because if onAttach isn't called yet of the respective fragment. So remove that line from there and write in onAttach method or onCreate method of fragment class.

Hope this will help you.

Vishal Chauhan
  • 932
  • 1
  • 6
  • 11
  • Hey, thanks for your answer. Already tried that, but still error at line 169 – Patrick260284 Jun 15 '16 at 07:39
  • 1
    ok got it...I think this problem is because your context is null..means getActivity returns null..please add your fragment class where you call VorgangDataSource – Vishal Chauhan Jun 15 '16 at 09:15
  • Added it in initialpost. A short explanation of what it does: It contains a `listview` that display my database entries. When I click on an entry the method `deleterow()` from `vorgangdatasource` is executed and deletes the selected row. – Patrick260284 Jun 15 '16 at 09:21
  • I have edit my answer..try this. – Vishal Chauhan Jun 15 '16 at 09:37
  • I added it in onCreateView, since I use dataSource there and it works :-) Thank you a lot. After 2 days it finally works. – Patrick260284 Jun 15 '16 at 09:53