سؤال

كيف يمكنك تعيين مستمع الحدث للحصول على سبينر عند تغيير العنصر المحدد؟

أساسا ما أحاول القيام به هو شيء مشابه لهذا:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
هل كانت مفيدة؟

المحلول

بعض الإجابات السابقة غير صحيحة. أنها تعمل من أجل الحاجيات الأخرى والآراء، ولكن الوثائق ل سبينر القطعة يصرح بوضوح:

الدوار لا يدعم العنصر انقر فوق الأحداث. سيقوم بتوصيل هذه الطريقة برفع استثناء.

أفضل استخدام onitemselstelectedlistener () في حين أن:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }

});

هذا يعمل بالنسبة لي.

لاحظ أنه يتم استدعاء طريقة OnItemSelectedleD محددة أيضا عند إنشاء العرض، حتى تتمكن من التفكير في وضعها في الداخل onCreate() طريقة الاتصال.

نصائح أخرى

Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

ملحوظة: تذكر شيء واحد.

سبينر OnItemSelectedListener سيتم تنفيذ الحدث مرتين:

  1. تهيئة الدوار
  2. حدد المستخدم يدويا

حاول التفريق بين هذين اثنين باستخدام متغير العلم.

يمكنك تنفيذ AdapterView.OnItemSelectedListener فئة في نشاطك.

ثم استخدم الخط أدناه onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

ثم تجاوز هذه الطريقتين:

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}

https://stackoverflow.com/q/1714426/811625.

يمكنك تجنب ONITEMSESLEATERTENER () التي يتم استدعاءها باستخدام فحص بسيط: تخزين فهرس التحديد الحالي في متغير عدد صحيح والتحقق من داخل OnItemselfected (..) قبل القيام بأي شيء.

على سبيل المثال:

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

من السبب iCurrentSelection يجب أن يكون في نطاق كائن لهذا العمل!

ابحث عن اسم Spinner والعثور على معرف ثم قم بتطبيق هذه الطريقة.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});

يقول مستندات من أجل القطعة

الدوار لا يدعم العنصر انقر فوق الأحداث.

يجب عليك استخدامها setOnItemSelectedListener للتعامل مع مشكلتك.

لا يهم، فهما ستقوم بتعيين OnItemSelStedListener في ONCREATE أو ONSTART - فلن يتم استدعاؤه خلال إنشاء النشاط أو بدء النشاط (على التوالي).
حتى نتمكن من ضبطه في OnCreate (وليس في OnStart!).
ما عليك سوى إضافة علامة لمعرفة التهيئة الأولى:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

ثم في oncreate (أو oncreatview) فقط:

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

إذا كنت تريد onchangedlistener الحقيقي (). قم بتخزين القيمة الأولية في المعالج والتحقق لمعرفة ما إذا كان قد تغير. انها بسيطة و ليس تتطلب متغير عالمي. يعمل إذا كان لديك أكثر من سبينر على الصفحة.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

الكائنات هي صديقك، واستخدامها.

spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );

خذ متغير عالمي للتحديد الحالي من Spinner:

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"  
android:textColor="@color/black"         
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape android:shape="rectangle">
    <solid android:color="#e2e3d7" />
   </shape>
 </item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
    <solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>

سيعمل ذلك على تسميته في الدوار و FindViewByD واستخدام هذا سيعمل

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            // your code here
        }

    });

أفضل طريقة ما أعتقد أنه سيكون لديك flagitemselected = 0; في onCreate(). وبعد وعلى البند الحدث المعنى بزيادة هذا العلم IE flagitemselected++; ؛ ثم تحقق

if(flagitemselected!=1)
{
// do your work here
}

هذا سوف يساعدني أعتقد.

خدعة واحدة وجدتها هي وضع SetOnitemSelectedClisteners في OnwindowFocuschanged بدلا من OnCreate. لم أجد أي آثار جانبية سيئة للقيام بذلك بهذه الطريقة، ومع ذلك. أساسا، إعداد المستمعين بعد أن تعادل النافذة. لست متأكدا من عدد مرات تشغيل OnwindowFocuschanged، ولكن من السهل بما فيه الكفاية لإنشاء متغير قفل إذا كنت تجد أنه يعمل كثيرا.

أعتقد أن Android قد يستخدم نظام المعالجة المستندة إلى الرسائل، وإذا وضعت كل شيء في OnCreate، فقد يتم تشغيله إلى حالات يتم فيه ملاءم الدوار بعد أن يتم رسمها. لذلك، سوف ينطلق المستمع الخاص بك بعد تعيين موقع العنصر. هذا تخمين متعلم، بالطبع، ولكن لا تتردد في تصحيح لي في هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top