2015-07-25 3 views
0

Я пытаюсь сохранить некоторые высокие оценки в sharedPreferences. В моей GameActivity, я создал sharedPreferences, как это:Сохранение в sharedPreferences из фрагмента вызывает InflateException

public class GameActivity extends Activity { 
    //public static final String KEY_RESTORE = "key_restore"; 
    //public static final String PREFS_SCORES = "pref_scores"; 
    private GameFragment mGameFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game); 
     SharedPreferences highScorePreferences = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
     //final SharedPreferences highScorePreferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
    } 
} 

Затем я пытаюсь добавить мой список рекордов, чтобы sharedPreferences как это:

public class GameFragment extends Fragment { 
    SharedPreferences highScorePreferences = this.getActivity().getSharedPreferences("MyPref", Context.MODE_PRIVATE); 
    //private static final int PREFERENCE_MODE_PRIVATE = 0; 
    //private SharedPreferences highScorePreferences = getActivity().getPreferences(PREFERENCE_MODE_PRIVATE); 
    private SharedPreferences.Editor highScoreEdit = highScorePreferences.edit(); 

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

     @Override 
     public void onClick(View view) { 
      if (currentImage == 2) { 
        hm.addScore("Bart", score); 

        String highScoreString = hm.getHighscoreString(); 
        Log.d("UT3", hm.getHighscoreString()); 
        score = 0; 
        highScoreEdit.putString("high_scores", highScoreString); 
        highScoreEdit.commit(); 
       } 
      } 


     }); 
     return rootView; 
    } 

Когда я пытаюсь запустить приложение, то GameActivity имеет это исключение во время выполнения: android.view.InflateException: Binary XML file line #8: Error inflating class fragment

Трассировка стека:

07-25 14:00:26.895 2024-2066/? W/PowerManagerService﹕ Timer 0x3->0x3|0x0 
07-25 14:00:27.015 2139-2139/? D/STATUSBAR-NetworkController﹕ onDataActivity: direction=0 
07-25 14:00:27.025 2139-2139/? D/STATUSBAR-NetworkController﹕ refreshSignalCluster: data=2 bt=false 
07-25 14:00:27.105 2024-2077/? I/InputReader﹕ Touch event's action is 0x0 (deviceType=0) [pCnt=1, s=0.1092 ] 
07-25 14:00:27.105 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x0 
07-25 14:00:27.105 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x0 
07-25 14:00:27.105 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x0 
07-25 14:00:27.215 2024-2077/? I/InputReader﹕ Touch event's action is 0x1 (deviceType=0) [pCnt=1, s=] 
07-25 14:00:27.215 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x1 
07-25 14:00:27.215 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x1 
07-25 14:00:27.215 2024-2076/? I/InputDispatcher﹕ Delivering touch to current input target: action: 0x1 
07-25 14:00:27.225 2024-2308/? I/power﹕ *** acquire_dvfs_lock : lockType : 1 freq : 1000000 
07-25 14:00:27.225 2024-2308/? D/PowerManagerService﹕ acquireDVFSLockLocked : type : DVFS_MIN_LIMIT frequency : 1000000 uid : 1000 pid : 2024 tag : ActivityManager 
07-25 14:00:27.225 2024-2308/? W/ActivityManager﹕ mDVFSLock.acquire() 
07-25 14:00:27.305 2024-2339/? D/WindowManager﹕ PhoneWindowManager: focusChangedLw 
07-25 14:00:27.305 2024-2339/? D/KeyguardViewMediator﹕ setHidden false 
07-25 14:00:27.346 16854-16854/org.example.whatstate D/AndroidRuntime﹕ Shutting down VM 
07-25 14:00:27.346 16854-16854/org.example.whatstate W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x419ed2a0) 
07-25 14:00:27.386 16854-16854/org.example.whatstate E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.whatstate/org.example.whatstate.GameActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117) 
      at android.app.ActivityThread.access$700(ActivityThread.java:134) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4867) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) 
      at android.app.Activity.setContentView(Activity.java:1901) 
      at org.example.whatstate.GameActivity.onCreate(GameActivity.java:22) 
      at android.app.Activity.performCreate(Activity.java:5047) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117) 
            at android.app.ActivityThread.access$700(ActivityThread.java:134) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4867) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at org.example.whatstate.GameFragment.<init>(GameFragment.java:47) 
      at java.lang.Class.newInstanceImpl(Native Method) 
      at java.lang.Class.newInstance(Class.java:1319) 
      at android.app.Fragment.instantiate(Fragment.java:577) 
      at android.app.Fragment.instantiate(Fragment.java:552) 
      at android.app.Activity.onCreateView(Activity.java:4695) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) 
            at android.app.Activity.setContentView(Activity.java:1901) 
            at org.example.whatstate.GameActivity.onCreate(GameActivity.java:22) 
            at android.app.Activity.performCreate(Activity.java:5047) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117) 
            at android.app.ActivityThread.access$700(ActivityThread.java:134) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4867) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
            at dalvik.system.NativeStart.main(Native Method) 
07-25 14:00:27.426 2024-2050/? E/android.os.Debug﹕ [email protected] > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error 
07-25 14:00:27.446 16955-16955/? I/dumpstate﹕ begin 

fragment_game.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/menu_background" 
    android:elevation="@dimen/elevation_high" 
    android:orientation="vertical" 
    android:padding="@dimen/menu_padding" 
    tools:context=".WhatStateActivity"> 

    <TextView 
     android:id="@+id/questionTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="@dimen/menu_space" 
     android:text="@string/guess_question" 
     android:textAppearance="?android:textAppearanceLarge" 
     android:textSize="@dimen/menu_text_size" /> 

    <ImageView 
     android:id="@+id/idImageViewPic" 
     android:layout_width="match_parent" 
     android:layout_height="342dp" 
     android:layout_weight="1.04" 
     android:adjustViewBounds="true" 
     android:background="#66FFFFFF" 
     android:maxHeight="91dip" 
     android:maxWidth="47dip" 
     android:padding="10dip" 
     android:src="@drawable/alabama" /> 

    <EditText 
     android:id="@+id/ResponseText" 
     android:layout_height="wrap_content" 
     android:hint="@string/response_hint" 
     android:inputType="textPersonName" 
     android:layout_width="fill_parent" 
     android:textSize="8pt"> 
    </EditText> 

    <Button 
     android:id="@+id/guess_button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/menu_button_margin" 
     android:padding="@dimen/menu_button_padding" 
     android:text="@string/continue_label" /> 

</LinearLayout> 

Обновленный код Как найти точку зрения, Id, если точка зрения была завышена в другом месте? (Новый Java):

public class GameFragment extends Fragment { 

    private AlertDialog mDialog; 
    private ImageView hImageViewPic; 
    private Button iButton, gButton; 

    private int currentImage = 0; 
    int[] images = {R.drawable.alabama, R.drawable.alaska, R.drawable.arizona, R.drawable.california, R.drawable.done}; 

    final String[] capitals = {"montgomery", "juneau", "phoenix", "sacramento"}; 

    //final SharedPreferences highScorePreferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE); 
    //final SharedPreferences highScorePreferences = getActivity().getSharedPreferences(0); 
    //private static final int PREFERENCE_MODE_PRIVATE = 0; 
    //private SharedPreferences highScorePreferences = getActivity().getPreferences(PREFERENCE_MODE_PRIVATE); 

    //SharedPreferences highScorePreferences = this.getActivity().getSharedPreferences("MyPref", Context.MODE_PRIVATE); 
    //private SharedPreferences.Editor highScoreEdit = highScorePreferences.edit(); 



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

     return rootView; 
    } 


    public void onActivityCreated(Bundle savedInstanceState) { 
     hImageViewPic = (ImageView) rootView.findViewById(R.id.idImageViewPic); 

     final TextView questionTextView = (TextView) rootView.findViewById(R.id.questionTextView); 

     iButton = (Button) rootView.findViewById(R.id.guess_button); 

     int resourceId = images[currentImage]; 
     String name = getResources().getResourceEntryName(resourceId); 
     //hImageViewPic.setImageResource(resourceId); 
     hImageViewPic.setTag(name); 
     final EditText responseField = (EditText) rootView.findViewById(R.id.ResponseText); 

     final MediaPlayer bubblePlayer = MediaPlayer.create(getActivity(), R.raw.bubble); 
     final MediaPlayer swooshPlayer = MediaPlayer.create(getActivity(), R.raw.swoosh); 




     // Handle buttons here... 
     final View guessButton = rootView.findViewById(R.id.guess_button); 
     guessButton.setOnClickListener(new View.OnClickListener() { 
      HighscoreManager hm = new HighscoreManager(); 
      int score = 0; 

      @Override 
      public void onClick(View view) { 
       bubblePlayer.start(); 
       String response = responseField.getText().toString().toLowerCase(); 
       String imageName = (String) hImageViewPic.getTag(); 
       String wrongTextAnnouncement = getString(R.string.wrong_text, imageName); 


       Log.d("UT3", "response: " + response); 
       Log.d("UT3", wrongTextAnnouncement); 
       Log.d("UT3", "imageName: " + imageName); 



       AlertDialog.Builder builder = 
         new AlertDialog.Builder(getActivity()); 
       final View customLayout = getActivity().getLayoutInflater().inflate(R.layout.capital_prompt, null); 
       builder.setView(customLayout); 

       if (imageName.equals(response)) { 
        Log.d("UT3", "right answer"); 
        final EditText capitalInputField = (EditText) customLayout.findViewById(R.id.userInput); 
        //capitalInputField.setText("Capital name"); 
        builder.setTitle(R.string.right_title); 
        builder.setMessage(R.string.right_text); 
        builder.setCancelable(false); 
        builder.setPositiveButton(R.string.ok_label, 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialogInterface, 
                int i) { 
            //nothing 
            String capitalName = capitals[currentImage]; 
            String capitalResponse = capitalInputField.getText().toString().toLowerCase(); 
            if (capitalResponse.equals(capitalName)){ 
             //add two points and move on to next picture 
             Log.d("UT3", "got right capital name"); 
             score += 2; 
             currentImage++; 
             currentImage = currentImage % images.length; 
             hImageViewPic.setImageResource(images[currentImage]); 
             int resourceId = images[currentImage]; 
             String name = getResources().getResourceEntryName(resourceId); 
             //hImageViewPic.setImageResource(resourceId); 
             hImageViewPic.setTag(name); 
             swooshPlayer.start(); 
            } 
            else{ 
             Log.d("UT3", "got wrong capital name"); 
             currentImage++; 
             currentImage = currentImage % images.length; 
             hImageViewPic.setImageResource(images[currentImage]); 
             int resourceId = images[currentImage]; 
             String name = getResources().getResourceEntryName(resourceId); 
             //hImageViewPic.setImageResource(resourceId); 
             hImageViewPic.setTag(name); 
             swooshPlayer.start(); 
            } 
           } 
          }); 


        score += 10; 
        String scoreString = String.valueOf(score); 
        Log.d("UT3", "Score: " + scoreString); 

        //String capitalString = "Name its capital"; 

        //iButton.setOnClickListener(getOnClickDoSomething(iButton)); 

       } else { 
        Log.d("UT3", "wrong answer"); 
        final View noCapitalLayout = getActivity().getLayoutInflater().inflate(R.layout.no_capital_prompt, null); 
        builder.setView(noCapitalLayout); 
        builder.setTitle(R.string.wrong_title); 
        //builder.setMessage(wrongTextAnnouncement); 
        builder.setCancelable(false); 
        builder.setPositiveButton(R.string.ok_label, 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialogInterface, 
                int i) { 
            // nothing 
           } 
          }); 
        //mDialog = builder.show(); 
        currentImage++; 
        currentImage = currentImage % images.length; 
        hImageViewPic.setImageResource(images[currentImage]); 
        Log.d("UT3", "reached wrong answer"); 
        int resourceId = images[currentImage]; 
        String name = getResources().getResourceEntryName(resourceId); 
        hImageViewPic.setImageResource(resourceId); 
        hImageViewPic.setTag(name); 
        swooshPlayer.start(); 
       } 
       mDialog = builder.show(); 


       Log.d("UT3", "currentImage: " + currentImage); 

       if (currentImage == 4) { 
        AlertDialog.Builder nameBuilder = 
          new AlertDialog.Builder(getActivity()); 
        final View nameInputLayout = getActivity().getLayoutInflater().inflate(R.layout.name_prompt, null); 
        nameBuilder.setView(nameInputLayout); 
        final EditText nameInputField = (EditText) nameInputLayout.findViewById(R.id.nameInput); 
        nameBuilder.setTitle(R.string.right_title); 
        //nameBuilder.setMessage(R.string.right_text); 
        nameBuilder.setCancelable(false); 


        nameBuilder.setPositiveButton(R.string.ok_label, 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialogInterface, 
                int i) { 
            //nothing 
            final String userName = nameInputField.getText().toString(); 
            hm.addScore(userName, score); 
            Log.d("UT3", "userName: " + userName); 

            String highScoreString = hm.getHighscoreString(); 
            Log.d("UT3", hm.getHighscoreString()); 
            score = 0; 
            //highScoreEdit.putString("high_scores", highScoreString); 
            //highScoreEdit.commit(); 
           } 
          }); 
        nameBuilder.show(); 

       } 
      } 


     }); 
    } 

    View.OnClickListener getOnClickDoSomething(final Button button) { 
     return new View.OnClickListener() { 
      public void onClick(View v) { 
       button.setText("text now set.. "); 

      } 
     }; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     // Get rid of the about dialog if it's still up 
     if (mDialog != null) 
      mDialog.dismiss(); 
    } 

    public void restartGame() { 
     initGame(); 
     initViews(getView()); 
    } 

    public void initGame() { 
     Log.d("UT3", "init game"); 
    } 

    private void initViews(View rootView) { 
     Log.d("UT3", "init views"); 
    } 

} 
+1

Пожалуйста, разместите всю трассировку стека. – CommonsWare

+0

Попробуйте инициализировать свои общие настройки внутри onActivityCreated –

+0

@MarkKeen Как это должно выглядеть? – user25976

ответ

0

Вы врезаться с NullPointerException при создании экземпляра GameFragment. Большая часть вашего кода с комментариями вызовет такой NullPointerException, так как getActivity() не будет работать над фрагментом до тех пор, пока не вызывается onAttach().