2013-10-02 133 views
3

我有以下幾點:爲什麼setVisibility會導致NullPointerException?

private OnItemSelectedListener CommentCodeListener = new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     Log.i(LogTAG, "spinner selection: "+ position); 
     LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 
     View view2=inflater.inflate(R.layout.commentdialog, null); 
     CheckBox CommentPaper = (CheckBox) view.findViewById(R.id.CommentPaper); 
     EditText CommentField = (EditText) view.findViewById(R.id.CommentOtherField); 
     String[] arr = getResources().getStringArray(R.array.CommentCodeListValues); 
     String CommentCode = arr[position]; 
     int CommentCodeInt = Integer.parseInt(arr[position]); 
     Log.i(LogTAG, "spinner selection (int): "+ CommentCodeInt); 
     CommentPaper.setVisibility(View.GONE); 
     CommentField.setVisibility(View.GONE); 
     if((CommentCodeInt >= 21 && CommentCodeInt <= 31) || CommentCodeInt == 41) { 
      Log.i(LogTAG, "set CommentPaper visible"); 
      CommentPaper.setVisibility(View.VISIBLE); 
     } 
     if((CommentCodeInt >=22 && CommentCodeInt <=33) || (CommentCodeInt >= 35 && CommentCodeInt <=36) || (CommentCodeInt >= 42 && CommentCodeInt <=43)) { 
      Log.i(LogTAG, "set CommentPaper visible"); 
     } 
     if(CommentCodeInt >=41 && CommentCodeInt <=43) { 
      Log.i(LogTAG, "set CommentField visible"); 
      CommentField.setVisibility(View.VISIBLE); 
     } 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     Log.i(LogTAG, "nothing selected"); 
    } 

}; 

佈局:

<LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:orientation="vertical" > 

     <Spinner 
      android:id="@+id/CommentCode_spinner" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <EditText 
      android:id="@+id/MultiLineComment" 
      android:layout_width="fill_parent"  
     android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="@string/commentLabel" 
      android:inputType="textMultiLine" 
      android:lines="3" 
      android:scrollbars="vertical" > 
     </EditText> 

     <EditText 
      android:id="@+id/CommentOtherField" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:ems="10" 
      android:hint="@string/commentLabel" 
      android:visibility="visible" > 
     </EditText> 

     <CheckBox 
      android:id="@+id/CommentPaper" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/reportCheckBox" 
      android:visibility="visible" /> 

     <Button 
      android:id="@+id/AddCommentButton" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/okButton" /> 

    </LinearLayout> 

</LinearLayout> 

請注意,以上(commentdialog.xml)佈局的對話框。

當我用微調器選擇某個東西時,會調用CommentCodeListener。當setVisibility被評論時,一切正常。 我試圖與

  • CheckBox CommentPaper = (CheckBox) findViewById(R.id.CommentPaper);
  • CheckBox CommentPaper = (CheckBox) view.findViewById(R.id.CommentPaper);
  • CheckBox CommentPaper = (CheckBox) view2.findViewById(R.id.CommentPaper);

,但沒有運氣。

我錯過了什麼?

+0

什麼是正在選擇的項目的佈局? 此外,爲什麼不遵循[Java命名約定](http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367),它決定了camelCase變量名稱? –

+0

inflating view2是什麼意思? – hakanostrom

+0

將佈局插入到question.view2中,使包含微調控件的commentdialog.xml膨脹。 – roncsak

回答

0

好吧,我把我的對話框全球:

public class MainActivity extends Activity { 
    private Dialog AddComment_Dialog; 
    .. 

而且這樣我可以把它在任何地方我想要的。 所以我只需輸入:

AddComment_Dialog.findViewById(R.id.sometext); 

我不知道爲什麼原來的代碼將無法正常工作,但它的照顧。
謝謝大家!

0

沒有setinvisible不能導致NPE。 CommentPaper/CommentField只是空和你要使用它

+0

那些不是null。測試。 – roncsak

0

您正在膨脹commentdialog.xml因此,如果您的CheckBoxEditText是在layout那麼你需要使用view2初始化它們

(CheckBox) view2.findViewById(R.id.CommentPaper); 

,並同用EditText或其他View在那layout

+0

是的,這就是爲什麼我創建view2但是我得到了NPE。奇怪的! – roncsak

+0

但你使用'view.findViewById(R.id.someId);'而不是'view2.findViewById(R.id.someId);'不奇怪,你只是看錯了'佈局' – codeMagic

+0

是的,你是對的!當我使用view.findViewB ...然後沒有任何反應。我的意思是EditText和複選框不會消失。 – roncsak

0

我會舉例說明如何在AlertDialog中設置複選框的可見性,我知道它與第一篇文章中的複選框不同,但也許它有助於某人。

  AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      LayoutInflater inflater = this.getLayoutInflater(); 
      View layout = inflater.inflate(R.layout.my_dialog, null); 

      CheckBox checkBox=(CheckBox)layout.findViewById(R.id.checkbox); 
      checkBox.setVisibility(View.GONE); 

      builder.setView(layout) //some Böttons 
          .setPositiveButton("Zurück",new DialogInterface.OnClickListener(){ 
           @Override 
           public void onClick(DialogInterface dialog,int which) { }}); 

      AlertDialog alert = builder.create(); 
      alert.show(); 
相關問題