Android - как использовать Spinner для скрытия / отображения Просмотр объектов - PullRequest
2 голосов
/ 26 сентября 2010

В приложении для Android я пытаюсь использовать Spinner, который при выборе опции будет скрывать / отображать соответствующие объекты View. Для моего приложения эти объекты представляют собой EditText и связанную метку TextView для поля. К сожалению, я не могу заставить EditText скрывать / отображать, и когда я добавляю код для скрытия / отображения TextView, я получаю исключение NullPointerException. Я предполагаю, что, поскольку я размещаю объекты вида в RelativeLayout, скрывая один из объектов вида, я удаляю его связь с другими объектами вида, следовательно, с NullPointer.

Кто-нибудь может понять, почему это может происходить? Вот мой код:

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>

1 Ответ

2 голосов
/ 26 сентября 2010

В опубликованном вами коде есть несколько небольших упущений. Когда я внес следующие изменения, я смог успешно скомпилировать и запустить ваш код.

  1. Вы пропустили точку с запятой после

    mLabel = (TextView) findViewById(R.id.field_label)
    
  2. Вставьте оператор break; между вашими двумя case вариантами.

  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. Хотя это и не обязательно для запуска вашей программы, было бы лучше явно указать ArrayAdapter<CharSequence> при определении adapter1, чтобы избежать проблем с типами.

...