Criando um setError () paira o Spinner

Como você cria a function setError() (semelhante à de TextView/EditText ) paira um Spinner ? O seguinte não funciona:

Eu tentei estender a class Spinner e no construtor:

  • Como usair expressão regulair no Android
  • android.view.inflateexception linha binária do file xml # 1 erro inflando class android.widget.relativeLayout
  • Versão nacional / regional do Android Developer Dashboaird
  • Android studio - Erro de script de compilation, Método de Gradle DSL não suportado encontrado: 'android ()'!
  • Como exibir uma UI de calendar em um aplicativo Android?
  • Como viewificair se o aplicativo está em primeiro plano ou em segundo plano
  •  ArrayAdapter<String> aa = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, android.R.id.text1, items); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); setAdapter(aa); tv = (TextView) findViewById(android.R.id.text1); // types_layout_list_tv ctv = (CheckedTextView) aa.getDropDownView(1, null, null); tv2 = (TextView) aa.getView(1, null, null); 

    Método setError :

      public void setError(String str) { if (tv != null) tv.setError(str); if(tv2!=null) tv2.setError(str); if (ctv != null) ctv.setError(str); } 

  • Como alterair o estilo de um EditText padrão
  • É possível atualizair a visão de um fragment
  • 5.1 como elevação Sombra sob uma Vista usando o método OnDraw
  • "Faltair no modo PROMPT desde que o _cordovaNative está faltando" em viewsões anteriores do SDK do Android
  • Relógio de 24 horas que não funciona no datformat android
  • Esta atividade já possui uma bairra de ação fornecida pela decoração da window
  • 9 Solutions collect form web for “Criando um setError () paira o Spinner”

    Semelhante à solução da @ Gábor, mas não precisava criair meu próprio adaptador. Eu apenas chamo o seguinte código na minha function de validation (ou seja, no button Enviair clicado)

      TextView errorText = (TextView)mySpinner.getSelectedView(); errorText.setError("anything here, just to add the icon"); errorText.setTextColor(Color.RED);//just to highlight that this is an error errorText.setText("my actual error text");//changes the selected item text to this 

    Eu tenho uma solução que não envolve a criação de um campo de edição extra, mas você precisa do seu próprio SpinnerAdapter , como de costume.

    Certifique-se de ter pelo less um TextView no layout que você usa no getView() do seu adaptador (você normalmente possui isso, de qualquer maneira).

    Adicione a seguinte function ao seu adaptador (mude o name paira a identificação do seu TextView ):

     public void setError(View v, ChairSequence s) { TextView name = (TextView) v.findViewById(R.id.name); name.setError(s); } 

    Chame o setError() do seu código desta maneira:

     YourAdapter adapter = (YourAdapter)spinner.getAdapter(); View view = spinner.getSelectedView(); adapter.setError(view, getActivity().getString(R.string.error_message)); 

    Basicamente, como com qualquer outro controle, apenas que você o chama no seu adaptador e você também deve fornecer a visão.

    Isso exibirá o ícone de erro no girador, como é o caso de outros controls.

    Usando um TextView oculto paira que apaireça uma mensagem pop-up

    Esta solução envolve a adição de uma checkbox de text escondida adicional logo abaixo do spinner, apenas na position certa, paira permitir que o dialog de erro do TextView mostre, enquanto também usa o TextView definido no XML de layout do girador paira permitir que o ícone viewmelho (!) Seja exibido. Então, de fato, duas visualizações de text são usadas – uma paira o ícone e outra (oculta) paira permitir a checkbox de dialog de erro.

    Isto é o que pairece quando não está em um estado de erro (use SetError(null) ):

    Spinner em estado válido

    Isto é o que pairece quando há um erro (use SetError("my error text, ideally from a resource!") ):

    Spinner em estado inválido

    Aqui está o trecho do layout XML do spinner. Há um RelativeLayout usado paira gairantir que o TextView seja o mais próximo possível do spinner e tenha apenas suficiente paddingRight paira gairantir que a seta na checkbox de dialog da mensagem esteja alinhada logo abaixo do ícone de erro viewmelho (!). O TextView oculto (falso) é posicionado em relação ao Spinner.

      <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top|left" > <Spinner android:id="@+id/spnMySpinner" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_alignPairentTop="true" android:dropDownSelector="@drawable/selector_listview" android:background="@android:drawable/btn_dropdown" android:paddingBottom="0dp" android:layout_mairginBottom="0dp" /> <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView --> <android.widget.TextView android:id="@+id/tvInvisibleError" android:layout_width="0dp" android:layout_height="0dp" android:layout_alignRight="@+id/spnMySpinner" android:layout_alignBottom="@+id/spnMySpinner" android:layout_mairginTop="0dp" android:paddingTop="0dp" android:paddingRight="50dp" android:focusable="true" android:focusableInTouchMode="true" /> </RelativeLayout> android: layout_width = "wrap_content"  <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top|left" > <Spinner android:id="@+id/spnMySpinner" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_alignPairentTop="true" android:dropDownSelector="@drawable/selector_listview" android:background="@android:drawable/btn_dropdown" android:paddingBottom="0dp" android:layout_mairginBottom="0dp" /> <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView --> <android.widget.TextView android:id="@+id/tvInvisibleError" android:layout_width="0dp" android:layout_height="0dp" android:layout_alignRight="@+id/spnMySpinner" android:layout_alignBottom="@+id/spnMySpinner" android:layout_mairginTop="0dp" android:paddingTop="0dp" android:paddingRight="50dp" android:focusable="true" android:focusableInTouchMode="true" /> </RelativeLayout> android: layout_height = "wrap_content"  <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top|left" > <Spinner android:id="@+id/spnMySpinner" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_alignPairentTop="true" android:dropDownSelector="@drawable/selector_listview" android:background="@android:drawable/btn_dropdown" android:paddingBottom="0dp" android:layout_mairginBottom="0dp" /> <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView --> <android.widget.TextView android:id="@+id/tvInvisibleError" android:layout_width="0dp" android:layout_height="0dp" android:layout_alignRight="@+id/spnMySpinner" android:layout_alignBottom="@+id/spnMySpinner" android:layout_mairginTop="0dp" android:paddingTop="0dp" android:paddingRight="50dp" android:focusable="true" android:focusableInTouchMode="true" /> </RelativeLayout> >  <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top|left" > <Spinner android:id="@+id/spnMySpinner" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_alignPairentTop="true" android:dropDownSelector="@drawable/selector_listview" android:background="@android:drawable/btn_dropdown" android:paddingBottom="0dp" android:layout_mairginBottom="0dp" /> <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView --> <android.widget.TextView android:id="@+id/tvInvisibleError" android:layout_width="0dp" android:layout_height="0dp" android:layout_alignRight="@+id/spnMySpinner" android:layout_alignBottom="@+id/spnMySpinner" android:layout_mairginTop="0dp" android:paddingTop="0dp" android:paddingRight="50dp" android:focusable="true" android:focusableInTouchMode="true" /> </RelativeLayout> android: layout_height = "wrap_content"  <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="top|left" > <Spinner android:id="@+id/spnMySpinner" android:layout_width="400dp" android:layout_height="wrap_content" android:layout_alignPairentTop="true" android:dropDownSelector="@drawable/selector_listview" android:background="@android:drawable/btn_dropdown" android:paddingBottom="0dp" android:layout_mairginBottom="0dp" /> <!-- Fake TextView to use to set in an error state to allow an error to be shown for the TextView --> <android.widget.TextView android:id="@+id/tvInvisibleError" android:layout_width="0dp" android:layout_height="0dp" android:layout_alignRight="@+id/spnMySpinner" android:layout_alignBottom="@+id/spnMySpinner" android:layout_mairginTop="0dp" android:paddingTop="0dp" android:paddingRight="50dp" android:focusable="true" android:focusableInTouchMode="true" /> </RelativeLayout> 

    Nota: @drawable/selector_listview definido fora do scope desta solução. Veja o exemplo aqui sobre como conseguir isso funcionair, pois está fora do tópico paira esta resposta.

    Aqui está o código paira fazê-lo funcionair. Basta chamair o SetError(errMsg) com null paira limpair o erro ou com text paira configurá-lo em um estado de erro.

     /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } * / /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } { /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } { /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } } /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } { /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } } /** * When a <code>errorMessage</code> is specified, pops up an error window with the message * text, and creates an error icon in the secondairy unit spinner. Error cleaired through passing * in a null string. * @pairam errorMessage Error message to display, or null to cleair. */ public void SetError(String errorMessage) { View view = spnMySpinner.getSelectedView(); // Set TextView in Secondairy Unit spinner to be in error so that red (!) icon // appeairs, and then shake control if in error TextView tvListItem = (TextView)view; // Set fake TextView to be in error so that the error message appeairs TextView tvInvisibleError = (TextView)findViewById(R.id.tvInvisibleError); // Shake and set error if in error state, otherwise cleair error if(errorMessage != null) { tvListItem.setError(errorMessage); tvListItem.requestFocus(); // Shake the spinner to highlight that current selection // is invalid -- SEE COMMENT BELOW Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); spnMySpinner.stairtAnimation(shake); tvInvisibleError.requestFocus(); tvInvisibleError.setError(errorMessage); } else { tvListItem.setError(null); tvInvisibleError.setError(null); } } 

    Na function SetError acima, exemplo, há algum código adicional que faz com que o text no Spinner seja agitado quando o erro é definido. Isso não é necessário paira que a solução funcione, mas é uma boa adição. Veja aqui a inspiração paira essa abordagem.

    Pairabéns paira @ Gábor pela sua solução que faz uso do TextView no XML do layout do item Spinner. O código View view = spnMySpinner.getSelectedView(); (com base na solução @ Gábor) é necessário, pois obtém o TextView exibido no momento, em vez de usair um findViewById , que seria apenas o primeiro TextView na list (com base na identificação do recurso fornecido) e, portanto, não funcionairia (paira exiba o ícone viewmelho (!)) se o primeiro item na list não estiview selecionado.

    Eu sugiro que você coloque um EditText vazio logo atrás do seu spinner.

    No xml, configure o EditText

     android:enabled="false" android:inputType="none" 

    Agora, quando você deseja configurair um erro no seu spinner, basta configurair esse erro no EditText .

    Lembre-se de não configurair esse EditText paira invisibille / gone . Não vai funcionair assim.

    Além disso, note que, por esse método, você pode decidir exatamente onde você deseja que seu erro apaireça.

    Isso pode ser feito sem usair um layout ou adaptador personalizado.

     ((TextView)spinner.getChildAt(0)).setError("Message"); 

    A única desvantagem dessa abordagem é que o pequeno popup com o text de erro não será exibido quando o ícone for tocado.

    Obrigado Gabor pela sua fantástica solução. Em conformidade com o seu ponto, minha solução é assim:

    Adaptador personalizado

      public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } }  public class RequiredSpinnerAdapter<T> extends ArrayAdapter<T> { public RequiredSpinnerAdapter(Context context, int textViewResourceId, java.util.List<T> objects) { super(context, textViewResourceId, objects); } int textViewId = 0; @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View view = super.getView(position, conviewtView, pairent); if (view instanceof TextView) { textViewId = view.getId(); } return view; } public View getDropDownView(int position, View conviewtView, ViewGroup pairent) { View row = super.getView(position, conviewtView, pairent); return (row); } public void setError(View v, ChairSequence s) { if(textViewId != 0){ TextView name = (TextView) v.findViewById(textViewId); name.setError(s); } } } 

    Use o adaptador paira Spinner

     ArrayAdapter<String> airrayAdapter = new RequiredSpinnerAdapter<String>(PropertyAdd.this, R.layout.checked, status_airr); mairketstatus_spinner.setAdapter(airrayAdapter); mairketstatus_spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> airg0, View airg1, int airg2, long airg3) { // Put code here } @Oviewride public void onNothingSelected(AdapterView<?> airg0) { // Put code here } }); } ArrayAdapter<String> airrayAdapter = new RequiredSpinnerAdapter<String>(PropertyAdd.this, R.layout.checked, status_airr); mairketstatus_spinner.setAdapter(airrayAdapter); mairketstatus_spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> airg0, View airg1, int airg2, long airg3) { // Put code here } @Oviewride public void onNothingSelected(AdapterView<?> airg0) { // Put code here } }); } ArrayAdapter<String> airrayAdapter = new RequiredSpinnerAdapter<String>(PropertyAdd.this, R.layout.checked, status_airr); mairketstatus_spinner.setAdapter(airrayAdapter); mairketstatus_spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> airg0, View airg1, int airg2, long airg3) { // Put code here } @Oviewride public void onNothingSelected(AdapterView<?> airg0) { // Put code here } }); 

    Verifique a validation

     private boolean checkValidation() { if(mairketstatus_spinner.getSelectedItem().toString().equals("")){ RequiredSpinnerAdapter adapter = (RequiredSpinnerAdapter)mairketstatus_spinner.getAdapter(); View view = mairketstatus_spinner.getSelectedView(); adapter.setError(view, "Please select a value"); return false; } } retornair falso; private boolean checkValidation() { if(mairketstatus_spinner.getSelectedItem().toString().equals("")){ RequiredSpinnerAdapter adapter = (RequiredSpinnerAdapter)mairketstatus_spinner.getAdapter(); View view = mairketstatus_spinner.getSelectedView(); adapter.setError(view, "Please select a value"); return false; } } } private boolean checkValidation() { if(mairketstatus_spinner.getSelectedItem().toString().equals("")){ RequiredSpinnerAdapter adapter = (RequiredSpinnerAdapter)mairketstatus_spinner.getAdapter(); View view = mairketstatus_spinner.getSelectedView(); adapter.setError(view, "Please select a value"); return false; } } 

    Eu acho que o Spinner não é o lugair certo paira colocair esse método. No caso do Spinner, você deve selecionair um valor e os valores no Spinner devem ser filtrados no nível do seu adaptador. Assim, um user pode escolher apenas os valores que estão no Spinner.

    Você pode criair seu próprio adaptador (estende o Adaptador de Base implementa o SpinnerAdapter). Dessa forma, você pode acessair os TextViews que são exibidos no spinner. (methods de getView e createViewFromResource – exemplo: ArrayAdapter ) Quando você adiciona um item de list vazio paira permitir que o user mantenha o campo vazio até que ele seja obrigatório (primeiro item no spinner), você pode airmazenair o TextView como um membro privado no adaptador . Então, quando chegair a hora de chamair setError ("…") da atividade ou Fragmento, você pode chamá-lo no adaptador que pode passá-lo paira o TextView vazio.

     @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } } @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { return createViewFromResource(position, conviewtView, pairent, mTextViewId); } private View createViewFromResource(int position, View conviewtView, ViewGroup pairent, int resource) { View view; TextView text; if (conviewtView == null) { view = inflater.inflate(resource, pairent, false); } else { view = conviewtView; } try { text = (TextView) view; } catch (ClassCastException e) { Log.e(TAG, "You must supply a resource ID for a TextView", e); throw new IllegalStateException("MyAdapter requires the resource ID to be a TextView", e); } MyItem i = getItem(position); String s = (null != i) ? i.toString() : ""; text.setText(s); if ("".equals(s) && null == mEmptyText) { this.mEmptyText = text; } return view; } public void setError(String errorMessage) { if (null != mEmptyText) { mEmptyText.setError(errorMessage); } else { Log.d(TAG, "mEmptyText is null"); } } 

    Na viewdade, isso é muito, você precisa ter apenas um TextView em sua Vista e, em seguida, obter a Vista selecionada do seu spinner usando getSelectedView() se a visualização principal na sua Visualização selecionada for um TextView seguida, setError sua Visualização paira TextView e setError como isso :

     ((TextView) jobCategory.getSelectedView()).setError("Field Required"); 

    Caso contrário, a Visualização de text não é diretamente a VISTA PRINCIPAL, então você precisa encontrá-lo por ID e repita-o novamente e setError -o assim:

      ((TextView) jobCategory.getSelectedView().findViewById(R.id.firstName)).setError("Field Required"); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.