4

Я использую 6.0.0 нож для масла в мое приложение, но после поворота фрагмента я получаю NullPointerException:фрагмент вращения нож для масла давая NullPointer

Мой код:

public class AddFriendFragment extends Fragment { 

    @InjectView(R.id.userSearchAddFriend) 
    ImageButton addFriendBtn; 
    @InjectView(R.id.userSearchName) 
    TextView name; 
    @InjectView(R.id.userSearchEmail) 
    TextView email; 
    @InjectView(R.id.userSearchProfilePicture) 
    ImageView profile; 

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

     ButterKnife.inject(this, v); 

     return v; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     ButterKnife.reset(this); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 


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

     final String id = getArguments().getString("user"); 

     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.fromLocalDatastore(); 
     query.whereEqualTo("objectId",id); 
     query.getFirstInBackground(new GetCallback<ParseUser>() { 
      @Override 
      public void done(final ParseUser parseUser, ParseException e) { 
       if(e != null || parseUser == null) 
       { 
        //logar erro 
        return; 
       } 

       name.setText(parseUser.get("firstName") + " " + parseUser.get("lastName")); 
       email.setText(parseUser.getUsername()); 
       ParseFile file =(ParseFile) parseUser.get("profileImg"); 
       if(file != null) { 
        Picasso.with(getActivity()).load(file.getUrl()).into(profile); 
       } 

       addFriendBtn.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         addFriend(parseUser); 
        } 
       }); 
      } 
     }); 
    } 

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

11-18 17:03:41.240 8468-8468/com.maddogs.mymoney E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.maddogs.mymoney, PID: 8468 
    java.lang.NullPointerException 
      at com.maddogs.mymoney.fragments.AddFriendFragment$1.done(AddFriendFragment.java:101) 
      at com.maddogs.mymoney.fragments.AddFriendFragment$1.done(AddFriendFragment.java:92) 
      at com.parse.GetCallback.internalDone(GetCallback.java:43) 
      at com.parse.GetCallback.internalDone(GetCallback.java:29) 
      at com.parse.Parse$6$1.run(Parse.java:940) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5086) 
      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:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

---- Редактировать ----

Линия 101

name.setText(parseUser.get("firstName") + " " + parseUser.get("lastName"));

И вызов в деятельности:

AddFriendFragment userFragm = new AddFriendFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putString("user",event.getUser().getObjectId()); 
     userFragm.setArguments(bundle); 

     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.root_frame, userFragm) 
       .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
       .addToBackStack(null).commit(); 
    } 

Любая помощь будет принята с благодарностью!

+0

Не могли бы вы указать, какая строка в вашем коде Line 101? (AddFriendFragment.java:101) Также ваш код в вашей деятельности, как вы восстанавливаете экземпляр фрагмента или воссоздаете новый экземпляр, будет полезен – Angelo

+0

Только что отредактирован с замечаниями, которые вы указали! – Leonardo

+0

Во-первых: данные не изменились с тех пор, как я решил изменить ориентацию, поэтому нет необходимости перезагружать все. У вас есть альтернативная схема в другой ориентации? Если да, проверьте, есть ли TextView с идентификатором userSearchName. Также установите точку разрыва на линию и посмотрите в своем отладчике то, что торилл равно null, возможно .get ("firstName") или .get ("lastName") возвращает null – Angelo

ответ

1

На самом деле я решил это, используя EventBus от https://github.com/greenrobot/EventBus. Я просто использую событие post на обратном вызове и получаю его на самом фрагменте, а затем я управляю изменением вида.

Как это:

query.fromLocalDatastore(); 
     query.whereEqualTo("objectId", id); 
     query.getFirstInBackground(new GetCallback<ParseUser>() { 
      @Override 
      public void done(final ParseUser parseUser, ParseException e) { 
       EventBus.getDefault().post(new AddFriendEvent(e == null, parseUser)); 
      } 
     }); 

И потом:

public void onEventMainThread(final AddFriendEvent event) { 
      if (!event.isResult()) 
       return; 

      name.setText(event.getUser().get("firstName") + " " + event.getUser().get("lastName")); 
      email.setText(event.getUser().getUsername()); 
      ParseFile file = (ParseFile) event.getUser().get("profileImg"); 
      if (file != null) { 
       Picasso.with(getActivity()).load(file.getUrl()).into(profile); 
      } 

      addFriendBtn.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        addFriend(event.getUser()); 
       } 
      }); 

      addFriendBtn.setOnClickListener(null); 
      addFriendBtn.setImageResource(R.drawable.ic_action_accept); 
     } 

Спасибо!

2

При изменении ориентации приложение будет вызывать onDestroy(). В вашем случае это сбросит инъекцию ButterKnife, вызвав «ButterKnife.reset».

Но onCreateView не вызывается в течение жизненного цикла изменения ориентации.

Проблема может быть решена, если вы переместите вызов инъекции ButterKnife в onViewCreated из onCreateView.

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

  • Нет связанных вопросов^_^