【问题标题】:Android - how to use Spinner to hide/display View objectsAndroid - 如何使用 Spinner 隐藏/显示视图对象
【发布时间】:2010-09-26 02:03:07
【问题描述】:

For an Android application, I'm trying to use a Spinner which, when an option is selected, will hide/display relevant View objects.对于我的应用程序,这些对象是字段的 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>

【问题讨论】:

    标签: android spinner show-hide


    【解决方案1】:

    您发布的代码中有一些小的遗漏。当我进行以下更改时,我能够成功编译并运行您的代码。

    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&lt;CharSequence&gt; 以避免类型问题。

    【讨论】:

    • 非常感谢。由于此代码是根据我的实际应用程序稍微调整的,因此分号不是实际问题(否则,我的应用程序将无法编译)。实际上是我根本没有设置我的 mLabel 成员变量!去搞清楚。我很好奇 - break 语句的目的是什么?
    • 如果没有break; 语句分隔每个case 语句,则执行会依次“落入”每个case 语句。您可能希望发生这种情况是有原因的,但通常使用switch 块来提供替代选项,并且每个case 应该只运行该特定条件的代码。有关switch 语句的一些示例和详细说明,请参阅:download.oracle.com/javase/tutorial/java/nutsandbolts/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2023-03-28
    • 2015-03-14
    • 2019-07-23
    相关资源
    最近更新 更多