Android Spinner与适配器关闭?

时间:2013-05-27 04:10:53

标签: android android-spinner

我有注册表单,它有两个edittexts和一个带有适配器的微调器,用于性别选择和数组值,当我点击注册按钮并选择一个性别它成功,但是当我没有选择性别并点击注册按钮它强行关闭?

这是我的完整代码......

MainActivity

EditText Fullname, Email;
Spinner GenderSpinner;
Button btnReg;

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // Importing all assets like buttons, text fields
    Fullname = (EditText) findViewById(R.id.full_name);
    Email = (EditText) findViewById(R.id.Email);

    // Gender = (EditText) findViewById(R.id.Gender);

    GenderSpinner = (Spinner) findViewById(R.id.Gender);
    ArrayAdapter<CharSequence> GenderAdapter = ArrayAdapter
            .createFromResource(this, R.array.sex,
                    android.R.layout.simple_spinner_item);
    GenderAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    GenderSpinner.setPrompt("SELECT YOUR GENDER");

    GenderSpinner.setAdapter(new NothingSelectedSpinnerAdapter(
            GenderAdapter, R.layout.gender_nothing_selected, MainActivity.this));

    btnReg = (Button) findViewById(R.id.btnReg);
    btnReg.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Read EditText dat
            String fullname = Fullname.getText().toString();
            String email = Email.getText().toString();
            String gender = GenderSpinner.getSelectedItem().toString();

        }
    });
}

}

NothingSelectedSpinnerAdapter

protected static final int EXTRA = 1;
protected SpinnerAdapter adapter;
protected Context context;
protected int nothingSelectedLayout;
protected int nothingSelectedDropdownLayout;
protected LayoutInflater layoutInflater;

public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter,
        int nothingSelectedLayout, Context context) {
    this(spinnerAdapter, nothingSelectedLayout, -1, context);
}

public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter,
        int nothingSelectedLayout, int nothingSelectedDropdownLayout,
        Context context) {
    this.adapter = spinnerAdapter;
    this.context = context;
    this.nothingSelectedLayout = nothingSelectedLayout;
    this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout;
    layoutInflater = LayoutInflater.from(context);
}

@Override
public final View getView(int position, View convertView, ViewGroup parent) {
    if (position == 0) {
        return getNothingSelectedView(parent);
    }
    return adapter.getView(position - EXTRA, null, parent);

}

protected View getNothingSelectedView(ViewGroup parent) {
    return layoutInflater.inflate(nothingSelectedLayout, parent, false);
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    // BUG! Vote to fix!!
    // http://code.google.com/p/android/issues/detail?id=17128 - Spinner
    // does not support multiple view types
    if (position == 0) {
        return nothingSelectedDropdownLayout == -1 ? new View(context)
                : getNothingSelectedDropdownView(parent);
    }

    return adapter.getDropDownView(position - EXTRA, null, parent); // could
                                                                        }

protected View getNothingSelectedDropdownView(ViewGroup parent) {
    return layoutInflater.inflate(nothingSelectedDropdownLayout, parent,
            false);
}

@Override
public int getCount() {
    int count = adapter.getCount();
    return count == 0 ? 0 : count + EXTRA;
}

@Override
public Object getItem(int position) {
    return position == 0 ? null : adapter.getItem(position - EXTRA);
}

@Override
public int getItemViewType(int position) {
    return position == 0 ? getViewTypeCount() - EXTRA : adapter
            .getItemViewType(position - EXTRA);
}

@Override
public int getViewTypeCount() {
    return adapter.getViewTypeCount() + EXTRA;
}

@Override
public long getItemId(int position) {
    return adapter.getItemId(position - EXTRA);
}

@Override
public boolean hasStableIds() {
    return adapter.hasStableIds();
}

@Override
public boolean isEmpty() {
    return adapter.isEmpty();
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
    adapter.registerDataSetObserver(observer);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
    adapter.unregisterDataSetObserver(observer);
}

@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return position == 0 ? false : true; // don't allow the 'nothing

}

}

1 个答案:

答案 0 :(得分:1)

看起来你在这里null

String gender = GenderSpinner.getSelectedItem().toString();

因为当您尝试在其上调用GenderSpinner.geSelecetedItem()时未选择任何内容,因此nulltoString()。您可以将所选项目设置为默认项目,或者如果要强制用户选择项目,则可以在运行此代码时在此处检查null,如果是,则向用户显示消息选择性别。

如果您使用第二个选项,那么您可以考虑使用RadioButtons,因为它对用户来说更自然,或者使用文本提示作为Spinner的默认值并带有消息比如“请选择性别”