অ্যান্ড্রয়েড স্পিনার: নির্বাচিত আইটেম পরিবর্তন ইভেন্ট পান


407

যখন নির্বাচিত আইটেমটি পরিবর্তিত হয় আপনি কীভাবে কোনও স্পিনারের জন্য ইভেন্ট শ্রোতাকে সেট করতে পারেন?

মূলত আমি যা করার চেষ্টা করছি তা এর সাথে মিলিয়ে কিছু:

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

আমি এই উত্তরগুলি চেষ্টা করেছি, কিন্তু কেউ সহায়ক ছিল না। একবার স্পিনার উপাদান আইটেম ক্লিক ইভেন্টগুলি সমর্থন করে না। স্পিনার ডকুমেন্টেশন

উত্তর:


812

পূর্বের কয়েকটি উত্তর সঠিক নয়। তারা অন্যান্য উইজেট এবং দর্শনগুলির জন্য কাজ করে তবে স্পিনার উইজেটের ডকুমেন্টেশন পরিষ্কারভাবে বলে:

একজন স্পিনার আইটেম ক্লিক ইভেন্টগুলিকে সমর্থন করে না। এই পদ্ধতিটি কল করা ব্যতিক্রম বাড়িয়ে তুলবে।

উন্নত ব্যবহার OnItemSelectedListener () পরিবর্তে:

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
    }

});

এটি আমার পক্ষে কাজ করে।

নোট করুন যে ভিউটি তৈরি হওয়ার সময় অন আইটেমলেক্ট পদ্ধতিতেও অনুরোধ করা হয়েছে, সুতরাং আপনি এটিকে onCreate()পদ্ধতি কলের ভিতরে রেখে বিবেচনা করতে পারেন ।


47
এটির সাথে সমস্যাটি হ'ল অন আইটেমলেক্ট পদ্ধতিটি যখন ভিউটি তৈরি করা হয় তখনও অনুরোধ করা হয়। সুতরাং যে কোডটিতে লেখা আছে সেগুলি শুরুতে কার্যকর হয়। ব্যবহারকারীর দ্বারা প্রকৃত কোনও আইটেম নির্বাচন চালু থাকলেই কি রয়েছে এমন কোডটি কার্যকর করার কোনও উপায় আছে?
কেনেথভির

39
ওভাররাইড অন স্টার্ট পদ্ধতিতে ওনক্রিট পদ্ধতিতে নয় বরং সেটঅনটাইমসলেক্টলাইজটিনার স্থাপন করে সেই সমস্যাটি সমাধান করা যেতে পারে। আমাকে বোকা ...
কেনেথভির

16
আমি শ্রোতাকে অন স্টার্ট পদ্ধতিতে রেখেছি, তবে এটি অনকারেটের মতো ব্যবহারকারীর কাছে কখনই কিছু দেখার আগে বলা হয়েছিল, সুতরাং আমার ক্ষেত্রে যেখানে "অগ্রসর" বোতামটি ব্যবহারকারীর কিছু না বাছাই হওয়া পর্যন্ত অদৃশ্য হয়ে থাকে, প্রাথমিক ডিসপ্লেতে বোতামটি দৃশ্যমান করা হয়। আপনি কি বলছেন আপনার অভিজ্ঞতাটি আলাদা? যদি তা হয় তবে আমি যে অফারটি চালু করছি তাতে আপনি আলাদাভাবে কী করছেন?
ইয়েগজেনি সিমকিন

7
প্রথম নির্বাচনটি রেকর্ড করতে আপনার বেনাম শ্রোতার অভ্যন্তরে অন্য ক্ষেত্রটি ব্যবহার করুন, এবং অন আইটেমসলেক্টডকে বলুন যে কোনও নির্বাচনের মুখোমুখি না হলে কিছু করা উচিত নয়? শুধু একটি ভাবনা.
স্যাম সুইভেনজোরগ্রিস্টিয়েনসেনসেন

4
তবে যদি ব্যবহারকারী "ডিফল্ট" আইটেমটি শীর্ষে নির্বাচন করে তবে কী হবে? তারপর onItemSelected(...)আঘাত করা হয় না। (আমি জানি কারণ এটি কেবল হার্ড
উপায়টি

55
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. ব্যবহারকারী নিজে নির্বাচন করেছেন ually

পতাকা ভেরিয়েবল ব্যবহার করে এই দুটি পৃথক করার চেষ্টা করুন।


3
আমারও দু'বার ডাক পড়ে! আমি বুঝতে পারছি না আপনি দুজনের মধ্যে পার্থক্য কীভাবে করবেন?
ম্যাক

18
বুলিয়ান ইনিশিয়ালডিসপ্লে = সত্যের মতো একটি গ্লোবাল বুলিয়ান সেট করুন; এবং তারপরে আপনার অন্বেষণে দেখুন এটি সত্য কিনা এবং যদি তা হয় তবে আপনি যা যা করতে যাচ্ছিলেন সেগুলি যাচাই বাছাই করতে যাবেন না তবে পতাকাটিকে মিথ্যাতে সেট করুন, পরের বারের জন্য এটি বলা হবে (যখন ব্যবহারকারী আসলে নির্বাচন করবে)।
ইয়েগজেনি সিমকিন

অনক্লিকলিস্টনার কার্যকর করার বিষয়ে সেরা ব্যাখ্যা।
পঙ্কজ কুমার

6
আমি ব্যক্তিগতভাবে হতবাক হয়েছি যে এত সাধারণ কিছু - যেমন একটি মৌলিক ইউআই উইজেট - কার্যকর করা এত রক্তাক্ত ... গুরুত্ব সহকারে - কোনও 'ডিফল্ট দেখানো আইটেম' সম্পত্তি তৈরি করা এবং বুলিয়ান পতাকা সংখ্যাকে বস্তুতে তৈরি করা কতটা কঠিন হতে পারে? ক্লাস নিজেই ?? আমি উদ্দেশ্য সি এর কোন অনুরাগী নই তবে আমি বলব যে অ্যান্ড্রয়েডে আইওএস উইজেট বাস্তবায়ন প্রায় 1/10 তম সময় নেয়।
বেনিট ভন বেনেট

4
আমিও একমত। স্পিনার হ'ল স্ক্রু আপ উইজেট। পপআপ বা ড্রপ কখন খোলা বা বন্ধ রয়েছে তা জানা খুব শক্ত। এটির জন্য কোনও ইভেন্ট যুক্ত করা কি এত কঠিন হত? উপরের সমাধানটি তালিকাটি খোলা বা বন্ধ থাকা অবস্থায় আপনাকে প্রায়শই বলতে পারে তবে তিনটি সমস্যা রয়েছে: (1) ইতিমধ্যে নির্বাচিত আইটেমটি নির্বাচনের জন্য কোনও ইভেন্ট নেই (এবং তালিকাটি বন্ধ হয়ে যায়) এবং (২) গর্ভপাতের জন্য কোনও ইভেন্ট নেই (স্পর্শ) এটি বন্ধ করার জন্য অফ-লিস্ট) এবং (3) অনভিংসিলিগ্রেটেড কখনই আমার পক্ষে আগুন লাগবে না।
ব্যাটডুড

19

আপনি বাস্তবায়ন করতে পারেন 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("");
}

16

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

আপনি অনিম্যাটসিলিগ্রেডলিস্টনার () কে একটি সাধারণ চেক সহ ডেকে আনা করতে পারেন: বর্তমান নির্বাচন সূচীটিকে একটি পূর্ণসংখ্যার ভেরিয়েবলে সংরক্ষণ করুন এবং কিছু করার আগে অনিমেটসলেক্টেড (..) এর মধ্যে চেক করুন।

উদাহরণ:

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 কাজ করার জন্য অবজেক্টের সুযোগ উচিত!


1
আপনি একটি বেনামি অভ্যন্তর শ্রেণীর মধ্যে একটি চূড়ান্ত-চূড়ান্ত পরিবর্তনশীল ব্যবহার করতে পারবেন না। iCurrentSelectionএই বেনাম শ্রেণীর মধ্যে যদি ভেরিয়েবলটি ঘোষণা করা হয় তবে তা ঠিক কাজ করবে। আপনি এটি -1 এ সূচনা করতে পারেন যাতে কোডটি প্রথম কলটিতে কার্যকর হয়।
dahvyd

2
আপনি যদি এটি ব্যবহার করেন তবে অবশ্যই ডাহাভিড সঠিক ছিল চূড়ান্ত। যে কোনও ক্ষেত্রে এটি সত্যিই ভাল কাজ করে। যদি অবস্থান 0 টি নির্বাচিত না হয় এবং যদি এটি পরিবর্তন করে তবে এটি আবার সক্ষম করুন আমি একটি সম্পাদনা পাঠ্য ক্ষেত্রটি অক্ষম করছিলাম। এর জন্য ধন্যবাদ.
নটুর 3

8

আপনার স্পিনার নামটি সন্ধান করুন এবং আইডি সন্ধান করুন তারপরে এই পদ্ধতিটি প্রয়োগ করুন।

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
    }
});

8

আপনি অনক্রিট বা অন স্টার্টে অনআইটিমসলেক্টলিস্টনার সেট করবেন তাতে কিছু যায় আসে না - এটি ক্রিয়াকলাপ তৈরির সময় বা যথাক্রমে শুরু করার সময় (যথাক্রমে) বলা হবে।
সুতরাং আমরা এটিকে অনক্রিটে সেট করতে পারি (এবং অন স্টার্টে নেই!)।
প্রথম সূচনাটি বের করার জন্য কেবল একটি পতাকা যুক্ত করুন:

private Spinner mSpinner;
private boolean mSpinnerInitialized;

তারপরে অনক্রিয়েট (বা অনক্রিয়েটভিউ) তে কেবল:

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;
            }
        });

1
এই পতাকা ব্যবহার করার জন্য আপনাকে ধন্যবাদ।
জাভান আর।

7

স্পিনার-উইজেটের জন্য দস্তাবেজগুলি বলে

একজন স্পিনার আইটেম ক্লিক ইভেন্টগুলিকে সমর্থন করে না।

setOnItemSelectedListenerআপনার সমস্যাটি পরিচালনা করতে আপনার ব্যবহার করা উচিত ।


6
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

1
স্পিনার প্রথম শুরু করা হলে এই কলব্যাকের সমস্যাটি মোকাবেলা করে না (এইভাবে এমন প্রতিক্রিয়া জাগানো যা কোনও আইটেমের সাথে নির্বাচিত হওয়ার সাথে কিছুই করার নেই)।
ইয়াভেগেনি সিমকিন

4

স্পিনার বর্তমান নির্বাচনের জন্য একটি বিশ্বব্যাপী পরিবর্তনশীল নিন:

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>

4

আপনি যদি সত্যই চান চান চ্যাঞ্জডলিস্টনার ()) হ্যান্ডলারে প্রাথমিক মান সংরক্ষণ করুন এবং এটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখুন। এটি সহজ এবং গ্লোবাল ভেরিয়েবলের প্রয়োজন হয় না । পৃষ্ঠায় একাধিক স্পিনার থাকলে কাজ করে।

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; 
        }
    }

অবজেক্টস আপনার বন্ধু, সেগুলি ব্যবহার করুন।


3
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
            }
        );

1

এটি স্পিনার এবং ফাইন্ডভিউবিডকে অন্তর্নিহিতভাবে কাজ করবে এবং এটি কাজ করবে এটি ব্যবহার করবে

    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
        }

    });

1

সবচেয়ে ভালো উপায় কি আমি মনে করি একটি আছে হবে flagitemselected = 0;মধ্যে onCreate()। এবং আইটেম নির্বাচিত ইভেন্ট বৃদ্ধি উপর যে পতাকা অর্থাত্ flagitemselected++; এবং তারপরে চেক করুন

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

এটি অনুমান করতে সহায়তা করবে।


0

আমি খুঁজে পেয়েছি একটি কৌশল অনক্রেট পরিবর্তে আপনার setOnItemSelectedListeners onWindowFocusChanged করা ছিল। এইভাবে এটি করার জন্য কোনও খারাপ পার্শ্ব প্রতিক্রিয়া আমি খুঁজে পাইনি। মূলত, উইন্ডোটি আঁকার পরে শ্রোতাদের সেট আপ করুন। উইন্ডো ফোকাস চ্যাঞ্জড কতবার চালিত তা আমি নিশ্চিত নই, তবে আপনি যদি খুব বেশি সময় এটি চালাচ্ছেন তবে নিজেকে একটি লক ভেরিয়েবল তৈরি করা যথেষ্ট সহজ।

আমি মনে করি অ্যান্ড্রয়েড সম্ভবত কোনও বার্তা-ভিত্তিক প্রসেসিং সিস্টেম ব্যবহার করছে এবং আপনি যদি এটি সমস্ত কিছু অনক্রিটের মধ্যে রাখেন তবে আপনি এমন পরিস্থিতিতে দৌড়াতে পারেন যেখানে স্পিনারটি টানার পরে এটি জনবসতিযুক্ত হয়। সুতরাং, আপনি আইটেমটির অবস্থান সেট করার পরে আপনার শ্রোতা আগুন বন্ধ করবে। এটি অবশ্যই একটি শিক্ষিত অনুমান, তবে এই সম্পর্কে আমাকে সংশোধন করতে দ্বিধা বোধ করবেন।


0

ডিফল্টরূপে, আপনি স্পিনারের অ্যারের প্রথম আইটেমটি পাবেন

value = spinner.getSelectedItem().toString();

আপনি যখন স্পিনারে মান নির্বাচন করেছেন এটি আপনাকে নির্বাচিত মান দেবে

আপনি যদি নির্বাচিত আইটেমের অবস্থান চান তবে এটি এর মতো করুন

pos = spinner.getSelectedItemPosition();

উপরোক্ত দুটি উত্তর শ্রোতার প্রয়োগ না করেই

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.