2016-06-15 64 views
-1

我有一个非活动类,我想要访问我保存在片段中的sharedpreferences。我可以在其他片段/活动中使用这些首选项,以便他们正在工作。当我尝试在我的non_Activity类中为variables分配prefvalues时,无论我改变了什么,我总是会得到一个nullpointerexception(我已经通过多个主题阅读了关于没有任何工作的堆栈)。共享首选项非活动分配给变量获取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

错误没问题了......我认为这个问题是因为你的上下文是空的.means getActivity返回null..please添加你的片段类,你调用VorgangDataSource –

+0

添加它在initialpost。一个简短的解释:它包含一个显示我的数据库条目的“listview”。当我点击一个条目时,'vorgangdatasource'中的方法'deleterow()'被执行并删除所选的行。 – Patrick260284