2014-09-23 64 views
2

我遇到了一個問題,我一次搜索了一遍,但在這一點上一切似乎都不合邏輯。 我有一個片段,當主要活動發生時發生(我認爲這不重要)。 在我有這樣的代碼片段,記下的onCreate部分,因爲錯誤發生在testtext.setText(" "+parola);片段中的getDefaultSharedPreferences上的NullPointerException

public class FinishedFragment 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; 

    /** 
    * 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 FinishedFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static FinishedFragment newInstance(String param1, String param2) { 
     FinishedFragment fragment = new FinishedFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 

     return fragment; 
    } 

    private View rootView; 

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ActionBar actionBar = getActivity().getActionBar(); 
     actionBar.hide(); 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     TextView testtext = (TextView) getActivity().findViewById(R.id.testtext); 
     String parola = prefs.getString("prefUserPassword","defaultpass"); 
     testtext.setText(" "+parola); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 



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


     return rootView; 
    } 

    // 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(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.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 
     public void onFragmentInteraction(Uri uri); 
    } 

} 

這裏是SettingsActivity.java

public class SettingsActivity extends PreferenceActivity 
{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     // add the xml resource 
     addPreferencesFromResource(R.xml.preferences); 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       this.finish(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

回答

1

您正在嘗試設置裏面的onCreateMethod UI元素,當視圖尚未創建時,這就是您的應用程序崩潰的原因。

嘗試將它們設置在onViewCreatedonActivityCreated方法中,以便在創建視圖時設置視圖元素。

@Override 
public void onViewCreated (View view, Bundle savedInstanceState) { 

    ActionBar actionBar = getActivity().getActionBar(); 
    actionBar.hide(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    TextView testtext = (TextView) getActivity().findViewById(R.id.testtext); 
    String parola = prefs.getString("prefUserPassword","defaultpass"); 
    testtext.setText(" "+parola); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 

} 
+1

感謝,我趕緊用Google搜索你的方法名,感到有點愚蠢的不知道他們;在onViewCreated中移動了代碼,現在它工作:) – Syncrtl64 2014-09-23 13:26:56

0

在片段的生命週期方法的調用順序是 -

onCreate() => onCreateView() 

您不能onCreate()設置文本,因爲還沒有創建視圖。

所以testtext仍然是空的 -

testtext.setText(" "+parola); //NullPointerException 

但是您可以將這樣的代碼轉移到onCreateView()方法 -

/*The view is created at this method call so you can access that view and 
    set the text for your TextView.*/ 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    rootView = inflater.inflate(R.layout.fragment_finished, container, false); 


    TextView testtext = (TextView) rootView.findViewById(R.id.testtext); 
    String parola = prefs.getString("prefUserPassword","defaultpass"); 
    testtext.setText(" "+parola); 

    return rootView; 
} 
相關問題