SORU
15 Mayıs 2009, Cuma


İlk metin ile bir Android Spinner yapmak için nasıl "Seçin"

Android, başlangıçta kullanıcı henüz bir seçim yaptı (zaman) metin görüntüleyen bir Çevirici kullanmak istiyorum"". Seçin Birini Kullanıcı döner düğmeyi tıklattığında, öğelerin listesi görüntülenir ve kullanıcı bu seçeneklerden birini seçer. Kullanıcı seçimi yapıldıktan sonra, seçilen madde Spinner görüntüleniyor yerine". Seçin Birini

Bir Spinner oluşturmak için aşağıdaki kodu var:

String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Bu kod ile, başlangıçta "Bir" görüntülenir. öğesini Sadece yeni bir öğe "Bir" öğeleri, ama o "Bir" de ilk madde olarak açılır listesinde görüntülenir, istediğim bir şey değil. Seçin ekleyebilirim

Bu sorunu nasıl düzeltebilirim?

CEVAP
6 AĞUSTOS 2010, Cuma


İşte Spinner görünümü geçersiz kılan genel bir çözüm. SetAdapter geçersiz kılar() -1 ve vekiller pozisyon 0'dan daha az bir istek dizesini görüntülemek verilen SpinnerAdapter için başlangıç konumunu ayarlamak için.

Bu 4.2, ama alıcı ile 1.5 sakının Android üzerinde test edilmiştir! Çünkü bu çözüm yansıma özel AdapterView aramak için kullanır.() setNextSelectedPositionİnt ve AdapterView.() setSelectedPositionİnt, gelecek işletim sistemi güncellemeleri. çalışmak için garanti değil Bu ihtimali görünüyor, ama hiçbir şekilde garanti edilir.

Normalde böyle bir şeyi tasvip etmem, ama bu soru defalarca soruldu ve benim çözüm sonrası düşündüm bu yeterince makul bir istek gibi görünüyor.

/**
 * A modified Spinner that doesn't automatically select the first entry in the list.
 *
 * Shows the prompt if nothing is selected.
 *
 * Limitations: does not display prompt if the entry list is empty.
 */
public class NoDefaultSpinner extends Spinner {

    public NoDefaultSpinner(Context context) {
        super(context);
    }

    public NoDefaultSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoDefaultSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setAdapter(SpinnerAdapter orig ) {
        final SpinnerAdapter adapter = newProxy(orig);

        super.setAdapter(adapter);

        try {
            final Method m = AdapterView.class.getDeclaredMethod(
                               "setNextSelectedPositionInt",int.class);
            m.setAccessible(true);
            m.invoke(this,-1);

            final Method n = AdapterView.class.getDeclaredMethod(
                               "setSelectedPositionInt",int.class);
            n.setAccessible(true);
            n.invoke(this,-1);
        } 
        catch( Exception e ) {
            throw new RuntimeException(e);
        }
    }

    protected SpinnerAdapter newProxy(SpinnerAdapter obj) {
        return (SpinnerAdapter) java.lang.reflect.Proxy.newProxyInstance(
                obj.getClass().getClassLoader(),
                new Class[]{SpinnerAdapter.class},
                new SpinnerAdapterProxy(obj));
    }



    /**
     * Intercepts getView() to display the prompt if position < 0
     */
    protected class SpinnerAdapterProxy implements InvocationHandler {

        protected SpinnerAdapter obj;
        protected Method getView;


        protected SpinnerAdapterProxy(SpinnerAdapter obj) {
            this.obj = obj;
            try {
                this.getView = SpinnerAdapter.class.getMethod(
                                 "getView",int.class,View.class,ViewGroup.class);
            } 
            catch( Exception e ) {
                throw new RuntimeException(e);
            }
        }

        public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
            try {
                return m.equals(getView) && 
                       (Integer)(args[0])<0 ? 
                         getView((Integer)args[0],(View)args[1],(ViewGroup)args[2]) : 
                         m.invoke(obj, args);
            } 
            catch (InvocationTargetException e) {
                throw e.getTargetException();
            } 
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        protected View getView(int position, View convertView, ViewGroup parent) 
          throws IllegalAccessException {

            if( position<0 ) {
                final TextView v = 
                  (TextView) ((LayoutInflater)getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE)).inflate(
                      android.R.layout.simple_spinner_item,parent,false);
                v.setText(getPrompt());
                return v;
            }
            return obj.getView(position,convertView,parent);
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • ghosti66

    ghosti66

    27 AĞUSTOS 2006
  • New Challenger - Game Reviews

    New Challeng

    20 Temmuz 2006