2010-09-26 83 views
2

對於Android應用程序,我試圖使用微調,當選擇一個選項時,將隱藏/顯示相關的視圖對象。對於我的應用程序,這些對象是該字段的EditText和關聯的TextView標籤。不幸的是,我似乎無法得到EditText來隱藏/顯示,當我添加代碼來隱藏/顯示TextView時,我得到一個NullPointerException。我認爲,因爲我在一個RelativeLayout中佈置視圖對象,通過隱藏其中一個視圖對象,我將刪除它與其他視圖對象的關係,因此是NullPointer。Android - 如何使用微調來隱藏/顯示查看對象

任何人都可以找出爲什麼會發生這種情況嗎?這裏是我的代碼:

public class FormFields extends Activity { 
    private Spinner mSpinner; 
    private EditText mTextField; 
    private TextView mLabel; 

    private static final int SPINNER_OPTION_FIRST = 0; 
    private static final int SPINNER_OPTION_SECOND = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.form_fields); 

     mTextField = (EditText) findViewById(R.id.text_field); 
     mLabel = (TextView) findViewById(R.id.field_label) 
     mSpinner = (Spinner) findViewById(R.id.spinner); 

     ArrayAdapter adapter1 = ArrayAdapter.createFromResource(
      this, R.array.spinnerOptions, android.R.layout.simple_spinner_item); 
     adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     mSpinner.setAdapter(adapter1); 

     mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
       switch(position) { 
        case SPINNER_OPTION_FIRST: { 
         mLabel.setVisibility(View.GONE); 
         mTextField.setVisibility(View.GONE); 
        } 
        case SPINNER_OPTION_SECOND: { 
         mLabel.setVisibility(View.VISIBLE); 
         mTextField.setVisibility(View.VISIBLE); 
        } 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parentView) { 
       // Do nothing 
      } 
     }); 
    } 
} 

form_fields.xml

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#104667"> 

     <TextView 
      android:id="@+id/spinner_label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="15dip" 
      android:textStyle="bold" 
      android:text="Please select an option" /> 

     <Spinner 
      android:id="@+id/spinner" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/spinner_label" 
      android:layout_marginLeft="25dip" 
      android:layout_marginRight="25dip" 
      android:drawSelectorOnTop="true" 
      android:prompt="@string/spinnerPrompt" /> 

     <TextView 
      android:id="@+id/field_label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/spinner" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="15dip" 
      android:textStyle="bold" 
      android:text="Enter text here: " 
      android:visibility="gone" /> 

     <EditText 
      android:id="@+id/text_field" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="25dip" 
      android:layout_marginRight="25dip" 
      android:layout_below="@+id/field_label" 
      android:visibility="gone" /> 
    </RelativeLayout> 
</ScrollView> 

回答

2

有在您發佈的代碼,一些小疏漏。當我做出以下更改時,我能夠成功編譯和運行代碼。

  1. 你以後

    mLabel = (TextView) findViewById(R.id.field_label) 
    
  2. 缺少分號在你的兩個case選項之間插入一個break;聲明。

  3. 您可以刪除您的case聲明中不必要的大括號。

    case SPINNER_OPTION_FIRST: 
        mLabel.setVisibility(View.GONE); 
        mTextField.setVisibility(View.GONE); 
        break;   
    case SPINNER_OPTION_SECOND: 
        mLabel.setVisibility(View.VISIBLE); 
        mTextField.setVisibility(View.VISIBLE); 
    
  4. 雖然沒有必要讓你的程序來運行,這將是更好地界定adapter1時避免類型的問題明確指定ArrayAdapter<CharSequence>

+0

謝謝一堆。由於這段代碼是從我的實際應用程序稍微調整的,分號不是實際問題(否則,我的應用程序不會編譯)。實際上,我根本沒有設置我的mLabel成員變量!去搞清楚。我很好奇 - break語句的目的是什麼? – Keeb13r 2010-09-26 05:51:50

+0

沒有'break;'語句將每個'case'語句分隔開來,執行「通過」連續到每個'case'語句。有些原因可能會導致這種情況的發生,但通常使用'switch'模塊來提供替代選項,每個'case'只應該運行該特定條件的代碼。有關'switch'語句的一些示例和詳細解釋,請參閱:http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html – Brian 2010-09-26 21:39:52