java - Butterknife fragment 旋转给出 NullPointer

标签 java android android-fragments nullpointerexception butterknife

我在我的应用程序中使用 ButterKnife 6.0.0,但在旋转一个 fragment 后我得到一个 NullPointerException:

我的代码:

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"));

以及 Activity 中的调用:

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

如有任何帮助,我们将不胜感激!

最佳答案

在方向改变时,应用程序将调用 onDestroy()。在您的情况下,这将通过调用“ButterKnife.reset”重置 ButterKnife 注入(inject)。

但在方向更改生命周期中不会调用 onCreateView。

如果将 ButterKnife 注入(inject)调用从 onCreateView 移至 onViewCreated,则问题可能会得到解决。

关于java - Butterknife fragment 旋转给出 NullPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27002200/

相关文章:

android - setCustomAnimation 回调前后的 FragmentTransaction

android - Material Design 父子导航过渡 RecyclerView 入口到细节 fragment

java - 我如何使用界面共享数据黑白 fragment 。我希望单击“编辑 fragment 1”中的文本数据的按钮显示在 fragment 2的 TextView 中

java - 使用 Xstream 序列化实体类

android - 如何将 GraphView 集成到我的项目中?

java - TextView Android 中的可点击词

android - 如何使用 gradle 构建文件从 Android 上的 org.apache 正确导入 HttpClient?

java - 动态数据库 API : How can I build an "add JSON attribute if not present" update request?

java - 如何在 Java 中每毫秒调用一次方法

Java - 对多项式求反