【问题标题】:Firebase Android Fragment int nullFirebase Android 片段 int null
【发布时间】:2017-07-11 08:58:14
【问题描述】:

我在片段中创建FragmentViewPost,它显示错误。但是,如果我不在 Fragment 项目中构建ViewPost,它就可以工作。我不知道是什么问题导致 Fragment 出错

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.View android.support.v7.widget.RecyclerView.findViewById(int)”

这是我的代码:

 public class FragmentViewPost extends Fragment {

        public static FragmentViewPost newInstance() {
            FragmentViewPost fragment = new FragmentViewPost();
            return fragment;
        }


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


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

        private RecyclerView mBlogList;
        private DatabaseReference mDatabase;
        private FirebaseAuth mAuth;
        private FirebaseAuth.AuthStateListener mAuthListener;

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            mAuth = FirebaseAuth.getInstance();
            mAuthListener = new FirebaseAuth.AuthStateListener() {
                @Override
                public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                    if(firebaseAuth.getCurrentUser() == null){


                        startActivity();

                    }
                }
            };

            mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog");
            mBlogList = (RecyclerView) mBlogList.findViewById(R.id.blog_list_fragment); <<< Problem

            mBlogList.setHasFixedSize(true);
            mBlogList.setLayoutManager(new LinearLayoutManager(getContext()));

        }

        private void startActivity() {

            Intent loginIntent = new Intent(getActivity(),PageLogin.class);
            loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(loginIntent);

        }


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

            mAuth.addAuthStateListener(mAuthListener);

            FirebaseRecyclerAdapter<Blog, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(

                    Blog.class,
                    R.layout.blog_row,
                    BlogViewHolder.class,
                    mDatabase

            ) {
                @Override
                protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {

                    viewHolder.setTitle(model.getTitle());
                    viewHolder.setDesc(model.getDesc());
                    viewHolder.setImage(getApplicationContext(), model.getImage());

                }
            };

            mBlogList.setAdapter(firebaseRecyclerAdapter);
        }



        public static class BlogViewHolder extends RecyclerView.ViewHolder{

            View mView;

            public BlogViewHolder(View itemView) {
                super(itemView);

                mView = itemView;
            }

            public void setTitle(String title){

                TextView post_title = (TextView) mView.findViewById(R.id.post_title);
                post_title.setText(title);
            }

            public void setDesc(String desc){

                TextView post_desc = (TextView) mView.findViewById(R.id.post_desc);
                post_desc.setText(desc);
            }

            public void setImage(Context ctx, String image){
                ImageView post_image = (ImageView) mView.findViewById(R.id.post_image);
                Picasso.with(ctx).load(image).into(post_image);
            }
        }

    //    @Override
    //    public boolean onCreateOptionsMenu(Menu menu) {
    //        getMenuInflater().inflate(R.menu.menu_post, menu);
    //        return super.onCreateOptionsMenu(menu);
    //    }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            inflater.inflate(R.menu.menu_post, menu);
            super.onCreateOptionsMenu(menu,inflater);
        }
    }

详细错误:

mBlogList = (RecyclerView) mBlogList.findViewById(R.id.blog_list_fragment);

【问题讨论】:

  • mBlogList = (RecyclerView) mBlogList.findViewById(R.id.blog_list_fragment);
  • 错误行 mBlogList @StefanSprenger
  • 您使用 mBlogList 实例化 mBlogList。应该是:mBlogList = (RecyclerView) view.findViewById(R.id.blog_list_fragment);
  • 不是错误,而是 viewHolder.setImage(getApplicationContext(), model.getImage());错误方法 populateViewHolder @StefanSpreger

标签: android android-fragments firebase firebase-authentication


【解决方案1】:

您需要使用以下代码:

View view = inflater.inflate(R.layout.fragment_fragment_view_post, container, false);
return view;

在您的 onCreateView() 方法中。

并改变这一行:

mBlogList = (RecyclerView) mBlogList.findViewById(R.id.blog_list_fragment);

mBlogList = (RecyclerView) view.findViewById(R.id.blog_list_fragment);

【讨论】:

  • 为什么在此处添加 View 行?这不是必需的。主要问题在于 mBlogList = mBlogList.findViewById。
  • 是的,主要问题是您以错误的方式找到视图,这就是null 的原因。您需要使用 view 对象按 id 查找视图。
  • 但是他在 onViewCreated(View view, Bundle saved...) 里面得到了它,还是我错过了什么?
  • 谢谢它的工作!但错误方法 populateViewHolder >> viewHolder.setImage(getApplicationContext(), model.getImage()); @AlexMamo
  • 那些声明需要在onCreateView() 方法中,它会正常工作。如果他在那个方法中移动这条线,就没有问题了。
猜你喜欢
  • 2014-02-03
  • 2012-09-13
  • 1970-01-01
  • 2014-09-15
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多