0

注意:這個問題已經解決了應付給我抓我自己的愚蠢的Android - LinearLayout中不添加自定義視圖

我想一個自定義的類添加到LinearLayout,但由於某些原因,我不斷收到一個NullPointerException

這是與另外交易的方法:

protected void onPostExecute(String results) { 
     System.out.println("ON POST EXECUTE : " + results); 
     try { 
      if(!results.equals(((MessageBlurb)container.getChildAt(0)).getMessage())){ 
       try { 
        container.removeViewAt(30); 
        for (int i = 29; i > 0; i--) { 
         container.addView(container.getChildAt(i-1), i); 
         container.removeViewAt(i-1); 
        } 
        container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0); 
       } catch (NullPointerException e) { 
        // TODO: handle exception 
       } 
      } 
     } 
     catch (Exception e) { 
      MessageBlurb mb = new MessageBlurb(getApplicationContext(), results, Color.BLACK); 
      mb.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
      System.out.println(mb); 
      container.addView(mb, 0); 
     } 


    } 

其中MessageBlurb延伸ViewGroup,因爲我有一個TextViewMessageBlurb內。

MessageBlurb類看起來是這樣的:

public MessageBlurb(Context context, String message, int color){ 
    super(context); 
    myTV = new TextView(context); 
    this.addView(myTV); 
    myTV.setText(message); 
    System.out.println("THE BLURB IS CREATED"); 
    this.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      System.out.println("YOU CLIKED THE BLURB"); 

     } 
    }); 

} 

我打印出來的描述mb,它給了我一個內存位置。還有的是,logcat的錯誤指向該行:

container.addView(mb, 0); 

container本身是在activity_main.xml文件中定義的LinearLayout。它通過一行代碼初始化:

container = (LinearLayout)findViewById(R.id.container); 

在XML文件中的佈局ID也被稱爲container

有人可以看到我在做什麼錯? 謝謝!

+0

如果你要在該行一個空指針異常,這意味着容器是空,所以你需要告訴我們在哪兒多數民衆贊成intialized。否則通過發佈完整的堆棧跟蹤來澄清你的帖子。 – gsingh2011

+0

如果這是在你的Activity的onCreate覆蓋中,你可能沒有在這個函數的開頭調用super.onCreate(...)。在沒有UI元素存在的情況下,您也可以在Activity的構造函數中執行此操作。 –

+0

@ gsingh2011和Mickael我編輯了我的問題。 – Jeeter

回答

0

事實證明,我被一個完整的白癡。我查看了我的onCreate(),發現我已經註釋掉該行: setContentView(...)

即便如此,我還要感謝所有回覆此主題的人。 對不起所有的麻煩! :)

2

我不是100%肯定,如果這是問題的所在,但下面的代碼看起來像是自找麻煩:

   container.removeViewAt(30); 
       for (int i = 29; i > 0; i--) { 
        container.addView(container.getChildAt(i-1), i); 
        container.removeViewAt(i-1); 
       } 
       container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0); 

它看起來就像你正在試圖刪除最後一個視圖容器並在頂部添加一個新的MessageBlurb。但是,您不需要像這樣手動移動所有視圖,只需在位置0添加一個新視圖就可以完成所有這些工作。試試這個替換它:

   container.removeViewAt(30); 
       container.addView(new MessageBlurb(getApplicationContext(), results, Color.BLACK), 0); 

此外,你有一個很好的理由創建消息導語在使用getApplicationContext()?您的代碼看起來像嵌套在一個Activity類內部的類的AsyncTask它的一部分,所以你可以並且應該通過活動本身的背景下(即new MessageBlurb(Activity.this, results, Color.BLACK)或類似的東西)。

希望有幫助!

+0

感謝您的建議。我沒有意識到帶有索引的addView會將所有內容都轉換爲一個。 – Jeeter

+0

+1,用於暗示正確使用應用上下文和活動上下文。 –

相關問題