Aller au contenu

Spinner sélection de l'élément déjà sélectionné [RESOLUT]


jimmy

Recommended Posts

Bonjour

Mon souci est indiqué dans le titre je cherche par n'importe quel moyen de récupérer l'évenement lorsque l'élément sélectionné de mon spinner est sélectionné une deuxième fois.

Mon code :

Spinner spinner = (Spinner) findViewById(R.id.test);

ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.alpha_level,
android.R.layout.simple_spinner_item);

adapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(1);

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> parent,
View view, int position, long id) {

Toast.makeText(context, "YES", 3000).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(context, "NO", 3000).show();
}

});

Mais rien ne se passe lorsque je clique sur l'élément déjà sélectionné, ce qui est le comportement normal je sais.

Seulement j'ai vu ce post http://stackoverflow...stions/5335306/

J'ai donc essayé la classe fourni dans la réponse mais le onClick n'est jamais appelé... donc cela ne marche pas.

Je cherche donc une solution.

Merci

Lien vers le commentaire
Partager sur d’autres sites

Je me répond donc a moi même il suffit que je demande de l'aide pour finalement trouver la réponse ^^

Donc voici ma classe Spinner :


import java.lang.reflect.Method;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.Spinner;
public class MySpinner extends Spinner {
private static Method s_pSelectionChangedMethod = null;
private Object ob=null;
static {	  
	try {
		Class noparams[] = {};
		Class targetClass = AdapterView.class;
		s_pSelectionChangedMethod = targetClass.getDeclaredMethod("selectionChanged", noparams);		  
		if (s_pSelectionChangedMethod != null) {
			s_pSelectionChangedMethod.setAccessible(true);			
		}
	} catch( Exception e ) {
		Log.e("Custom spinner, reflection bug:", e.getMessage());
		throw new RuntimeException(e);
	}
}
public MySpinner(Context context) {
	super(context);

}
public MySpinner(Context context, AttributeSet attrs) {
	super(context, attrs);
}
public MySpinner(Context context, AttributeSet attrs, int defStyle) {
	super(context, attrs, defStyle);
}
public void testReflectionForSelectionChanged() {
	try {
		Class noparams[] = {};		
		s_pSelectionChangedMethod.invoke(this, noparams);
	} catch (Exception e) {
		Log.e("Custom spinner, reflection bug: ", e.getMessage());
		e.printStackTrace();  
		throw new RuntimeException(e);
	}
}

@Override
  public boolean onTouchEvent(MotionEvent m)
  {
   if (m.getAction()==MotionEvent.ACTION_DOWN)
   {
	ob=this.getSelectedItem();

   }

   return super.onTouchEvent(m);
  }

@Override
public boolean performClick() {
	boolean handled = false;

	if (!handled)
	{
	 handled = true;
		Context context = getContext();

		final Adapter adapter = getAdapter();
		CharSequence[] values = new String[adapter.getCount()];
		for(int i=0; i< adapter.getCount();i++){
		 values[i] = (String)adapter.getItem(i);
		}
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		if (super.getPrompt() != null) {
			builder.setTitle(super.getPrompt());
		}

		builder.setSingleChoiceItems(values, getSelectedItemPosition(), new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
 // TODO Auto-generated method stub

 MySpinner.this.setSelection(arg1);
 if (getSelectedItem().equals(ob)){
  testReflectionForSelectionChanged();
 }

 arg0.dismiss();
}

		}).show();

	}
	return handled;
}

}

Donc il suffit de surcharger performClick :) et cela permet aussi de pouvoir faire une dialog personalisé si besoin (se que je n'est pas fait). Si vous avez des questions n'hésitez pas je pourrais peut être y répondre.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...