2016-06-15 3 views
-1

У меня есть класс non activity, где я хочу получить доступ к моему sharedpreferences Я сохранил фрагмент. Я могу использовать эти prefs в других фрагментах/действиях, поэтому они работают. Когда я пытаюсь присвоить prefvalues ​​variables в моем классе non_Activity, я всегда получаю исключение nullpointer независимо от того, что я изменил (я читал через многословные темы здесь, в стеке, ничего не работало). ВходОбщие назначения без назначения функции переменной получает nullpointerexception

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

Ошибка:

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(); 
    } 
} 
+0

У какой линии возникает проблема? –

+0

В конструкторе на первом sharedprefs: 'this.sharedPreferences = mcontext.getSharedPreferences (" FILELB ", Context.MODE_PRIVATE);' – Patrick260284

+0

Показать код, в котором создается объект класса VorgangDataSource –

ответ

1

Проблема заключается в этой строке

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

Здесь getActivity() возвращает null, потому что если onAttach еще не вызывается соответствующего фрагмента. Поэтому удалите эту строку и напишите в методе onAttach или в методе onCreate класса фрагмента.

Надеюсь, это вам поможет.

+0

Эй, спасибо за ваш ответ. Уже пробовал эту, но все же ошибку в строке 169 – Patrick260284

+1

ok получил ее ... Я думаю, эта проблема связана с тем, что ваш контекст имеет значение null..means getActivity возвращает null..пожалуйста, добавьте класс фрагмента, где вы вызываете VorgangDataSource –

+0

. Добавил его в initialpost. Краткое объяснение того, что он делает: он содержит «список», отображающий мои записи в базе данных. Когда я нажимаю на запись, выполняется метод 'deleterow()' из 'vorgangdatasource' и удаляет выбранную строку. – Patrick260284

Смежные вопросы