尝试调用虚方法

Posted

技术标签:

【中文标题】尝试调用虚方法【英文标题】:Attempt to invoke virtual method 【发布时间】:2014-03-26 13:24:14 【问题描述】:

我试图在我的onCreateView 中获取一些LinearLayouts,但我的应用程序崩溃并显示以下消息:

23430-23430/? W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

代码如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    new Body().execute();

        card01 = (LinearLayout) getView().findViewById(R.id.card01);
        card02 = (LinearLayout) getView().findViewById(R.id.card02);
        card03 = (LinearLayout) getView().findViewById(R.id.card03);
        card04 = (LinearLayout) getView().findViewById(R.id.card04);
        card05 = (LinearLayout) getView().findViewById(R.id.card05);
        card06 = (LinearLayout) getView().findViewById(R.id.card06);


        card01.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Toast.makeText(getActivity(), "Card Clicked", Toast.LENGTH_SHORT).show();
            
        );

    return rootView;

这是一个纯粹的Fragment 类。调用此FragmentActivity 不包含此Fragment。我做错了吗? Fragmentalways 是否应该在 Activity 内?

按要求整AsyncTask

    // AsyncTask
    private class Body extends AsyncTask<Void, Void, Void> 

        @Override
        protected void onPreExecute() 
            super.onPreExecute();

            mProgressDialog = new ProgressDialog(getActivity());
            mProgressDialog.setTitle("Fetching your info");
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();

        

        @Override
        protected Void doInBackground(Void... params) 

            Document doc;

            try 
                // Connect to the web site
                doc = Jsoup.connect(url).get();

                // Using Elements to get the Meta data

                //Date of Event
                Elements dateElement = doc.select("span[class=date-display-single]");

                //Headline of Event
                Elements titleElement = doc.select("h2[property=schema:name]");

                //Description of Event
                Elements bodyElement = doc.select("div[class=field field-name-body field-type-text-with-summary field-label-hidden]");

                // get the dates
                date1 = dateElement.eq(0).text();
                date2 = dateElement.eq(1).text();
                date3 = dateElement.eq(2).text();
                date4 = dateElement.eq(3).text();
                date5 = dateElement.eq(4).text();
                date6 = dateElement.eq(5).text();

                // get headlines
                head1 = titleElement.eq(0).text();
                head2 = titleElement.eq(1).text();
                head3 = titleElement.eq(2).text();
                head4 = titleElement.eq(3).text();
                head5 = titleElement.eq(4).text();
                head6 = titleElement.eq(5).text();

                // get description
                body1 = bodyElement.eq(0).toString();
                body1 = Jsoup.parse(body1.replaceAll("<br />", "br2n")).toString();
                body1 = Jsoup.parse(body1.replaceAll("</p>", "p2n")).text();
                body1 = body1.replaceAll("br2n", "\n");
                body1 = body1.replaceAll("p2n", "\n\n");

                body2 = bodyElement.eq(1).toString();
                body2 = Jsoup.parse(body2.replaceAll("<br />", "br2n")).toString();
                body2 = Jsoup.parse(body2.replaceAll("</p>", "p2n")).text();
                body2 = body2.replaceAll("br2n", "\n");
                body2 = body2.replaceAll("p2n", "\n\n");

                body3 = bodyElement.eq(2).toString();
                body3 = Jsoup.parse(body3.replaceAll("<br />", "br2n")).toString();
                body3 = Jsoup.parse(body3.replaceAll("</p>", "p2n")).text();
                body3 = body3.replaceAll("br2n", "\n");
                body3 = body3.replaceAll("p2n", "\n\n");

                body4 = bodyElement.eq(3).toString();
                body4 = Jsoup.parse(body4.replaceAll("<br />", "br2n")).toString();
                body4 = Jsoup.parse(body4.replaceAll("</p>", "p2n")).text();
                body4 = body4.replaceAll("br2n", "\n");
                body4 = body4.replaceAll("p2n", "\n\n");

                body5 = bodyElement.eq(4).toString();
                body5 = Jsoup.parse(body5.replaceAll("<br />", "br2n")).toString();
                body5 = Jsoup.parse(body5.replaceAll("</p>", "p2n")).text();
                body5 = body5.replaceAll("br2n", "\n");
                body5 = body5.replaceAll("p2n", "\n\n");

                body6 = bodyElement.eq(5).toString();
                body6 = Jsoup.parse(body6.replaceAll("<br />", "br2n")).toString();
                body6 = Jsoup.parse(body6.replaceAll("</p>", "p2n")).text();
                body6 = body6.replaceAll("br2n", "\n");
                body6 = body6.replaceAll("p2n", "\n\n");

                //cut out the date in the headlines (13 characters) if the String has something to cut
                //Let's  hope the website stays like this
                if (head1.length() > 0) 
                    head1 = head1.substring(13);
                
                if (head2.length() > 0) 
                    head2 = head2.substring(13);
                
                if (head3.length() > 0) 
                    head3 = head3.substring(13);
                
                if (head4.length() > 0) 
                    head4 = head4.substring(13);
                
                if (head5.length() > 0) 
                    head5 = head5.substring(13);
                
                if (head6.length() > 0) 
                    head6 = head6.substring(13);
                

                //Get Event Labels
                AssetManager am = getActivity().getAssets();
                bwe = BitmapFactory.decodeStream(am.open("label/bwe.jpg"));
                commaklar = BitmapFactory.decodeStream(am.open("label/commaklar.jpg"));
//                musica = BitmapFactory.decodeStream(am.open("label/musica.jpg"));
                doualatag = BitmapFactory.decodeStream(am.open("label/doualatag.jpg"));
                synestesia = BitmapFactory.decodeStream(am.open("label/synestesia.jpg"));
                douala = BitmapFactory.decodeStream(am.open("label/douala.jpg"));
//                tanzen = BitmapFactory.decodeStream(am.open("label/tanzen.jpg"));
//                nacht = BitmapFactory.decodeStream(am.open("label/nacht.jpg"));
             catch (Exception e) 
                e.printStackTrace();
            
            return null;
        

        @Override
        protected void onPostExecute(Void result) 
            mProgressDialog.dismiss();

            try 

                RobotoTextView date_widget1 = (RobotoTextView) getActivity().findViewById(R.id.date01);
                date_widget1.setText(date1);

                RobotoTextView head_widget1 = (RobotoTextView) getActivity().findViewById(R.id.head01);
                head_widget1.setText(head1);

                RobotoTextView body_widget1 = (RobotoTextView) getActivity().findViewById(R.id.body1);
                Whitelist.simpleText().addTags("br", "p");
                body_widget1.setText(body1);

                ImageView label1 = (ImageView) getView().findViewById(R.id.label1);

                if (head1.contains("BLACKWHITE")) 
                    label1.setImageBitmap(bwe);
                
                if (date1.contains("Do")) 
                    ;
                    label1.setImageBitmap(doualatag);
                
                if (head1.contains("COMMAKLAR")) 
                    label1.setImageBitmap(commaklar);
                
                if (head1.toLowerCase().contains("synestesia") | head1.contains("SYNESTESIA")) 
                    label1.setImageBitmap(synestesia);
                
                if (label1.getDrawable() == null) 
                    label1.setImageBitmap(douala);
                

                RobotoTextView date_widget2 = (RobotoTextView) getActivity().findViewById(R.id.date02);
                date_widget2.setText(date2);

                RobotoTextView head_widget2 = (RobotoTextView) getActivity().findViewById(R.id.head02);
                head_widget2.setText(head2);

                RobotoTextView body_widget2 = (RobotoTextView) getActivity().findViewById(R.id.body2);
                body_widget2.setText(body2);

                ImageView label2 = (ImageView) getView().findViewById(R.id.label2);

                if (head2.contains("BLACKWHITE")) 
                    label2.setImageBitmap(bwe);
                
                if (date2.contains("Do")) 
                    label2.setImageBitmap(doualatag);
                
                if (head2.contains("COMMAKLAR")) 
                    label2.setImageBitmap(commaklar);
                
                if (head2.toLowerCase().contains("synestesia")) 
                    label2.setImageBitmap(synestesia);
                
                if (label2.getDrawable() == null) 
                    label2.setImageBitmap(douala);
                

                RobotoTextView date_widget3 = (RobotoTextView) getActivity().findViewById(R.id.date03);
                date_widget3.setText(date3);

                RobotoTextView head_widget3 = (RobotoTextView) getActivity().findViewById(R.id.head03);
                head_widget3.setText(head3);

                RobotoTextView body_widget3 = (RobotoTextView) getActivity().findViewById(R.id.body3);
                body_widget3.setText(body3);

                ImageView label3 = (ImageView) getView().findViewById(R.id.label3);

                if (head3.contains("BLACKWHITE")) 
                    label3.setImageBitmap(bwe);
                
                if (date3.contains("Do")) 
                    label3.setImageBitmap(doualatag);
                
                if (head3.contains("COMMAKLAR")) 
                    label3.setImageBitmap(commaklar);
                
                if (head3.toLowerCase().contains("synestesia")) 
                    label3.setImageBitmap(synestesia);
                
                if (label3.getDrawable() == null) 
                    label3.setImageBitmap(douala);
                

                RobotoTextView date_widget4 = (RobotoTextView) getActivity().findViewById(R.id.date04);
                date_widget4.setText(date4);

                RobotoTextView head_widget4 = (RobotoTextView) getActivity().findViewById(R.id.head04);
                head_widget4.setText(head4);

                RobotoTextView body_widget4 = (RobotoTextView) getActivity().findViewById(R.id.body4);
                body_widget4.setText(body4);

                ImageView label4 = (ImageView) getView().findViewById(R.id.label4);

                if (head4.contains("BLACKWHITE")) 
                    label4.setImageBitmap(bwe);
                
                if (date4.contains("Do")) 
                    label4.setImageBitmap(doualatag);
                
                if (head4.contains("COMMAKLAR")) 
                    label4.setImageBitmap(commaklar);
                
                if (head4.toLowerCase().contains("synestesia")) 
                    label4.setImageBitmap(synestesia);
                
                if (label4.getDrawable() == null) 
                    label4.setImageBitmap(douala);
                

                if (!head5.equals("")) 
                    RobotoTextView date_widget5 = (RobotoTextView) getActivity().findViewById(R.id.date05);
                    date_widget5.setText(date5);

                    RobotoTextView head_widget5 = (RobotoTextView) getActivity().findViewById(R.id.head05);
                    head_widget5.setText(head5);

                    RobotoTextView body_widget5 = (RobotoTextView) getActivity().findViewById(R.id.body5);
                    body_widget5.setText(body5);

                    ImageView label5 = (ImageView) getView().findViewById(R.id.label5);

                    if (head5.contains("BLACKWHITE")) 
                        label5.setImageBitmap(bwe);
                    
                    if (date5.contains("Do")) 
                        label5.setImageBitmap(doualatag);
                    
                    if (head5.contains("COMMAKLAR")) 
                        label5.setImageBitmap(commaklar);
                    
                    if (head5.toLowerCase().contains("synestesia")) 
                        label5.setImageBitmap(synestesia);
                    
                    if (label5.getDrawable() == null) 
                        label5.setImageBitmap(douala);
                    
                

                if (!head6.equals("")) 
                    RobotoTextView date_widget6 = (RobotoTextView) getActivity().findViewById(R.id.date06);
                    date_widget6.setText(date6);

                    RobotoTextView head_widget6 = (RobotoTextView) getActivity().findViewById(R.id.head06);
                    head_widget6.setText(head6);

                    RobotoTextView body_widget6 = (RobotoTextView) getActivity().findViewById(R.id.body6);
                    body_widget6.setText(body6);

                    ImageView label6 = (ImageView) getView().findViewById(R.id.label6);

                    if (head6.contains("BLACKWHITE")) 
                        label6.setImageBitmap(bwe);
                    
                    if (date6.contains("Do")) 
                        label6.setImageBitmap(doualatag);
                    
                    if (head6.contains("COMMAKLAR")) 
                        label6.setImageBitmap(commaklar);
                    
                    if (head6.toLowerCase().contains("synestesia")) 
                        label6.setImageBitmap(synestesia);
                    
                    if (label6.getDrawable() == null) 
                        label6.setImageBitmap(douala);
                    
                

             catch (NullPointerException e) 
                e.printStackTrace();
            
        
    

【问题讨论】:

【参考方案1】:

在我尝试使组件扩展视图时导致相同的NullPointerException,可能是由于使用了LayoutInflater

View view = LayoutInflater.from(context).inflate(R.layout.layout_index_bar, null);
container = (LinearLayout) view.findViewById(R.id.indexContainer);

【讨论】:

【参考方案2】:

改成

 card01 = (LinearLayout) rootView.findViewById(R.id.card01);
 card02 = (LinearLayout) rootView.findViewById(R.id.card02);
 card03 = (LinearLayout) rootView.findViewById(R.id.card03);
 card04 = (LinearLayout) rootView.findViewById(R.id.card04);
 card05 = (LinearLayout) rootView.findViewById(R.id.card05);
 card06 = (LinearLayout) rootView.findViewById(R.id.card06);

你膨胀了一个布局。视图属于膨胀布局。所以使用视图对象来初始化onCreateView中的视图

Fragment 由 Acitvity 托管

您可以在onActivityCreated 中使用getView 并初始化视图

onCreateView 中初始化你的TextView。由于 Asynctask 是一个内部类,你可以在那里更新 ui

声明

 RobotoTextView date_widget2;

作为实例变量

然后在onCreateView中

 date_widget2= (RobotoTextView) rootView.findViewById(R.id.date02);

【讨论】:

好的,谢谢。如您所见,在那之前我有一个 AsyncTask 。我在onPostExecute 中遇到了同样的异常,但不能使用 rootview。我应该把new Body().execute() 放在onActivityCreated 中吗? @mike.b93 你在异步任务中做什么。取决于那个 我解析一个网站并在onPostExecute 上将文本设置为TextViews 让我们continue this discussion in chat【参考方案3】:

您太早调用getView() - 它只会返回您自己从onCreateView() 返回的视图。

onCreateView() 内部使用最近膨胀的rootView 而不是getView()

【讨论】:

以上是关于尝试调用虚方法的主要内容,如果未能解决你的问题,请参考以下文章

片段通信问题(尝试调用虚方法)

尝试调用虚方法。显示位置的应用程序

SearchView 尝试在空引用上调用虚方法

如何解决“调用纯虚方法”

关于C++设计模式的问题,纯虚方法调用

尝试在空对象引用上调用虚方法 - 如何正确更改TextView的值