2

I have a spinner and I want to show/hide something when the user exits the spinner without doing any thing. for example, when the user touches an area outside the spinner. p.s. the onTouchEvent for the container layout (LinearLayout in my case) is also not called. here is my implementation for the custom spineer:

public SpinnerHintAdapter(Activity context, int resourceId, int textViewId, List<SpinnerItem> list, Spinner parent){

    super(context,resourceId,textViewId, list);
    flater = context.getLayoutInflater();
    this.items = list;
    this.gender = parent;

}

 @Override
 public int getCount() {
     return items.size();
 }

 @Nullable
 @Override
 public SpinnerItem getItem(int position) {
     return items.get(position);
 }

 @Override
 public long getItemId(int position) {
     return position;
 }

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
     SpinnerItem spinnerItem = getItem(position);
     View rowView = flater.inflate(R.layout.gender_item ,null,true);
     TextView txtTitle = (TextView) rowView.findViewById(R.id.main_text);
     txtTitle.setText(spinnerItem.getName());
     txtTitle.setTextColor(txtTitle.getResources().getColor(R.color.color_white));
     Log.i(Tags.byEmail, "VVVVVVVVVVVVv");;
     gender.setVisibility(View.VISIBLE);
     return rowView;
}


 @Override
 public View getDropDownView(int position, View convertView, ViewGroup parent) {
     firstTime = false;
     SpinnerItem rowItem = getItem(position);
     View rowView = flater.inflate(R.layout.gender_drop_down_item ,null,true);
     TextView txtTitle = (TextView) rowView.findViewById(R.id.drop_down_text);
     txtTitle.setText(rowItem.getName());
     if(!isEnabled(position)){
         txtTitle.setBackground(txtTitle.getResources().getDrawable(R.drawable.normal_rounded_text_field));
         txtTitle.setTextColor(Color.parseColor("#777777"));
     }
     parent.setBackground(parent.getResources().getDrawable(R.drawable.normal_rounded_text_field));
     txtTitle.setEnabled(isEnabled(position));
     gender.setVisibility(View.INVISIBLE);
     Log.i(Tags.byEmail, "DDDDDDDDDDDDDDDDDD");
     return rowView;
 }

 @Override
 public boolean isEnabled(int position) {
     if(position == 0)
         return false;
     return super.isEnabled(position);
 }

}

when the user exits without selecting an item the getView function is not called and hence the gender (is the spinner object itself) will not be visible. I tried OnItemSelected and OnNothingSelected are also not called. event OnTouch events are not called.

The following Events are not called when the user exits: 1- OnItemSlected 2- OnNothingSelected 3- OnFocusChanged. 4- OnTouch

Alnour Alharin
  • 320
  • 3
  • 13

2 Answers2

1

I think that's event will work for you as magic, no?

public class CustomSpinner extends Spinner {

    ... Constructors ...

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        Log.d(CustomSpinner.class.getSimpleName(), "onWindowFocusChanged: " + hasWindowFocus);
        if (hasWindowFocus) {
            // User click out of window
        } else {
            // User click in spinner window
        }
    }
}
Dmitry Velychko
  • 1,505
  • 16
  • 14
0

With a Spinner you set an AdapterView.OnItemSelectedListener which implements two methods; onItemSelected and onNothingSelected.

Like this:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
       // This is called when the user selects an item in the Spinner
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // This is called when the user closes the spinner selecting nothing
    }
});
LukeWaggoner
  • 8,869
  • 1
  • 29
  • 28