दिलचस्प पोस्ट
एक तत्व में पाठ का चयन करना (आपके माउस के साथ हाइलाइटिंग के समान) जावा में अच्छी तरह से बनाई गई XML को कैसे पढ़ें, लेकिन स्कीमा को छोड़ दें? कॉर्डोवा एंड्रॉइड आवश्यकताएं विफल हुईं: "ग्रेडल का एक स्थापित संस्करण नहीं मिल सका" क्यों टुकड़े का उपयोग करें? थोड़ा सा सेट है या नहीं, यह जांचता है डेटाग्रिड दृश्य में वर्तमान में चयनित पंक्ति का सूचकांक जावास्क्रिप्ट में सॉर्ट जेसन ऑब्जेक्ट क्या मुझे ईएवी मॉडल का उपयोग करना चाहिए? मैं अजगर के साथ मेरी डेस्कटॉप पृष्ठभूमि कैसे बदल सकता / सकती हूं? वस्तु ढेर के लिए पर्याप्त स्थान आरक्षित नहीं कर सके दिनांक का उपयोग करते समय दिन का प्रत्यय प्राप्त करना.ToString () सीएसएस में चेकबॉक्स की सीमा शैली कैसे बदलनी है? बश चर के साथ ब्रेस विस्तार – {0 .. $ foo} JQuery के साथ बाध्य घटनाओं का ऑर्डर कैसे करें Django में "स्लग" क्या है?

स्पिनर: राज्य प्राप्त करें या खुलता है जब अधिसूचित हो

क्या यह जानना संभव है कि Spinner खुले या बंद है या नहीं? स्पिनरों के लिए ओपन लिस्टनर के कुछ प्रकार के होते ही बेहतर होगा।

मैंने इस तरह एक OnItemSelectedListener का उपयोग करने की कोशिश की है:

 spinnerType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { executeSomething(); } @Override public void onNothingSelected(AdapterView<?> parent) { Log.d("nothing" , "selected"); } }); 

मुझे पता है कि अगर कुछ चुना गया है तो विंडो बंद हो जाएगी (executeSomething () में) लेकिन अगर मैं संवाद के बाहर क्लिक करता हूं तो मुझे सूचित नहीं किया जाता, जो स्पिनर को भी बंद कर देता है

Solutions Collecting From Web of "स्पिनर: राज्य प्राप्त करें या खुलता है जब अधिसूचित हो"

उन घटनाओं को देखने के लिए एक अन्य विकल्प Spinner वर्ग को बढ़ाने और इसके तरीकों में से एक का उपयोग करना है ( performClick() जो अपने डायलॉग / पॉपअप को ट्रिगर करेगा) इसके बाद इस कस्टम Spinner पकड़े हुए विंडो के फ़ोकस की निगरानी करें। यह आपको सभी संभव परिष्करण संभावनाओं (या तो संवाद या ड्रॉपडाउन मोड के लिए) के लिए वांटेड बंद घटना प्रदान करना चाहिए।

कस्टम Spinner वर्ग:

 public class CustomSpinner extends Spinner { /** * An interface which a client of this Spinner could use to receive * open/closed events for this Spinner. */ public interface OnSpinnerEventsListener { /** * Callback triggered when the spinner was opened. */ void onSpinnerOpened(Spinner spinner); /** * Callback triggered when the spinner was closed. */ void onSpinnerClosed(Spinner spinner); } private OnSpinnerEventsListener mListener; private boolean mOpenInitiated = false; // implement the Spinner constructors that you need @Override public boolean performClick() { // register that the Spinner was opened so we have a status // indicator for when the container holding this Spinner may lose focus mOpenInitiated = true; if (mListener != null) { mListener.onSpinnerOpened(this); } return super.performClick(); } /** * Register the listener which will listen for events. */ public void setSpinnerEventsListener( OnSpinnerEventsListener onSpinnerEventsListener) { mListener = onSpinnerEventsListener; } /** * Propagate the closed Spinner event to the listener from outside if needed. */ public void performClosedEvent() { mOpenInitiated = false; if (mListener != null) { mListener.onSpinnerClosed(this); } } /** * A boolean flag indicating that the Spinner triggered an open event. * * @return true for opened Spinner */ public boolean hasBeenOpened() { return mOpenInitiated; } public void onWindowFocusChanged (boolean hasFocus) { if (hasBeenOpened() && hasFocus) { performClosedEvent(); } } } 

@ लुकप्रोग विस्मयकारी समाधान पर आधारित, मैं बस एक छोटा बदलाव जोड़ना चाहता हूं जो बहुत उपयोगी होगा यदि किसी व्यक्ति को किसी टुकड़ी के अंदर कस्टमस्पिनर का उपयोग करना है। Activity.onWindowFocusChanged का उपयोग करने के बजाय। View.onWindowFocusChanged फ़ंक्शन, हम देखें। View.onWindowFocusChanged फ़ंक्शन को ओवरराइड करते हैं। इस प्रकार पूरे कस्टमस्पियन वर्ग बन जाते हैं

 import android.content.Context; import android.util.AttributeSet; import android.widget.Spinner; public class CustomSpinner extends Spinner { private static final String TAG = "CustomSpinner"; private OnSpinnerEventsListener mListener; private boolean mOpenInitiated = false; public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { super(context, attrs, defStyleAttr, mode); } public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSpinner(Context context, int mode) { super(context, mode); } public CustomSpinner(Context context) { super(context); } public interface OnSpinnerEventsListener { void onSpinnerOpened(); void onSpinnerClosed(); } @Override public boolean performClick() { // register that the Spinner was opened so we have a status // indicator for the activity(which may lose focus for some other // reasons) mOpenInitiated = true; if (mListener != null) { mListener.onSpinnerOpened(); } return super.performClick(); } public void setSpinnerEventsListener(OnSpinnerEventsListener onSpinnerEventsListener) { mListener = onSpinnerEventsListener; } /** * Propagate the closed Spinner event to the listener from outside. */ public void performClosedEvent() { mOpenInitiated = false; if (mListener != null) { mListener.onSpinnerClosed(); } } /** * A boolean flag indicating that the Spinner triggered an open event. * * @return true for opened Spinner */ public boolean hasBeenOpened() { return mOpenInitiated; } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { android.util.Log.d(TAG, "onWindowFocusChanged"); super.onWindowFocusChanged(hasWindowFocus); if (hasBeenOpened() && hasWindowFocus) { android.util.Log.i(TAG, "closing popup"); performClosedEvent(); } } } 

हाय दोस्तों, मैं इस मुद्दे पर पिछले दो दिनों से संघर्ष कर रहा हूं और आखिरकार मुझे अपना काम पूरा करने के लिए समाधान मिला। मैंने कोशिश की और यह पूरी तरह से काम किया। धन्यवाद

  mSpinner.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ Toast.makeText(MapActivity.this,"down",Toast.LENGTH_LONG).show(); // Load your spinner here } return false; } }); 

फ़ंक्शन में कोई भी निर्माण नहीं हुआ है, लेकिन किसी OnTouchListener और OnItemSelectedListener OnTouchListener साथ ऐसा करना बहुत आसान है।

 abstract class OnOpenListener implements OnTouchListener, OnItemSelectedListener { public OnOpenListener(Spinner spinner) { spinner.setOnTouchListener(this); spinner.setOnItemSelectedListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { onOpen(); } return false; } @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { onClose(); } @Override public void onNothingSelected(AdapterView<?> arg0) { onClose(); } abstract public void onOpen(); abstract public void onClose(); } 

और फिर उचित श्रोताओं को असाइन करें:

  OnOpenListener onOpenListener = new OnOpenListener(mySpinner) { @Override public void onOpen() { // spinner was opened } @Override public void onClose() { // spinner was closed } }; 

मुझे स्पिनर के साथ इस व्यवहार को प्राप्त करने का कोई तरीका नहीं मिल सका है, इसलिए मेरे लिए काम करने वाली चीज स्पिनर (कस्टम) एडाप्टर का उपयोग करने के बजाय थी:

 public interface SpinnerListener { void onSpinnerExpanded(); void onSpinnerCollapsed(); } 

फिर एक कस्टम एडाप्टर लिखा जा सकता है कि "स्पिनर विस्तारित" दृश्य को पकड़ लेता है और "विस्तार" और "ढहने" घटनाओं के लिए सुनने के लिए एक श्रोता को जोड़ता है मैं प्रयोग किया गया कस्टम एडाप्टर है:

 public class ListeningArrayAdapter<T> extends ArrayAdapter<T> { private ViewGroup itemParent; private final Collection<SpinnerListener> spinnerListeners = new ArrayList<SpinnerListener>(); public ListeningArrayAdapter(Context context, int resource, T[] objects) { super(context, resource, objects); } // Add the rest of the constructors here ... // Just grab the spinner view (parent of the spinner item view) and add a listener to it. @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if (isParentTheListView(parent)) { itemParent = parent; addFocusListenerAsExpansionListener(); } return super.getDropDownView(position, convertView, parent); } // Assumes the item view parent is a ListView (which it is when a Spinner class is used) private boolean isParentTheListView(ViewGroup parent) { return (parent != itemParent && parent != null && ListView.class.isAssignableFrom(parent.getClass())); } // Add a focus listener to listen to spinner expansion and collapse events. private void addFocusListenerAsExpansionListener() { final View.OnFocusChangeListener listenerWrapper = new OnFocusChangeListenerWrapper(itemParent.getOnFocusChangeListener(), spinnerListeners); itemParent.setOnFocusChangeListener(listenerWrapper); } // Utility method. public boolean isExpanded() { return (itemParent != null && itemParent.hasFocus()); } public void addSpinnerListener(SpinnerListener spinnerListener) { spinnerListeners.add(spinnerListener); } public boolean removeSpinnerListener(SpinnerListener spinnerListener) { return spinnerListeners.remove(spinnerListener); } // Listener that listens for 'expand' and 'collapse' events. private static class OnFocusChangeListenerWrapper implements View.OnFocusChangeListener { private final Collection<SpinnerListener> spinnerListeners; private final View.OnFocusChangeListener originalFocusListener; private OnFocusChangeListenerWrapper(View.OnFocusChangeListener originalFocusListener, Collection<SpinnerListener> spinnerListeners) { this.spinnerListeners = spinnerListeners; this.originalFocusListener = originalFocusListener; } @Override public void onFocusChange(View view, boolean hasFocus) { if (originalFocusListener != null) { originalFocusListener.onFocusChange(view, hasFocus); // Preserve the pre-existing focus listener (if any). } callSpinnerListeners(hasFocus); } private void callSpinnerListeners(boolean hasFocus) { for (SpinnerListener spinnerListener : spinnerListeners) { if (spinnerListener != null) { callSpinnerListener(hasFocus, spinnerListener); } } } private void callSpinnerListener(boolean hasFocus, SpinnerListener spinnerListener) { if (hasFocus) { spinnerListener.onSpinnerExpanded(); } else { spinnerListener.onSpinnerCollapsed(); } } } } 

फिर जब मैं अपनी गतिविधि या टुकड़े में स्पिनर का इस्तेमाल करता हूं तो मुझे यह करना था कि स्पिनर एडाप्टर को ऊपर दिए गए कस्टम एडैप्टर में सेट करना था:

 private ListeningArrayAdapter<CharSequence> adapter; private Spinner buildSpinner() { final CharSequence[] items = {"One", "Two", "Three"}; final Spinner spinner = (Spinner)getActivity().getLayoutInflater().inflate(R.layout.item_spinner, null); adapter = new ListeningArrayAdapter<CharSequence>(getActivity(), R.layout.item_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); adapter.addSpinnerListener(new TestSpinnerListener(getActivity())); // Add your own spinner listener implementation here. spinner.setAdapter(adapter); return spinner; } 

मुझे पता है कि यह एक हैक और एट बिट भंगुर है लेकिन यह मेरे लिए काम किया है यह बेहतर होगा यदि स्पिनर वर्ग में यह सब कार्यक्षमता निर्माण हो और आपको विस्तार-पतन श्रोता सेट करने की अनुमति दी। समय के लिए मुझे इस हैक के साथ करना होगा।

मुझे लगता है कि जब यह खोला और बंद हो गया था, तो यह सबसे अच्छा तरीका है:

  1. अगर यह बंद हो गया था, और अब इसे "getDropDownView" एडेप्टर में कॉल करता है, तो यह माना जा सकता है कि इसे खोला गया है।

  2. अगर "ऑन-आईम सेलेक्टेड" या "ऑन-नॉन-चुने गए" को बुलाया जाता है, तो अब इसे बंद हो गया है।


संपादित करें: यहां एक नमूना कोड है

 public class MainActivity extends AppCompatActivity { boolean isSpinnerClosed = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppCompatSpinner spinner2 = (AppCompatSpinner) findViewById(R.id.spinner2); List<String> list = new ArrayList<String>(); list.add("list 1"); list.add("list 2"); list.add("list 3"); Log.d("AppLog", "started"); //spinner2.setondi ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) { @Override public View getDropDownView(final int position, @Nullable final View convertView, @NonNull final ViewGroup parent) { if (isSpinnerClosed) { Log.d("AppLog", "closed->open"); isSpinnerClosed = false; } return super.getDropDownView(position, convertView, parent); } }; spinner2.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(final AdapterView<?> adapterView, final View view, final int i, final long l) { Log.d("AppLog", "onItemSelected"); if (!isSpinnerClosed) { Log.d("AppLog", "open->closed"); isSpinnerClosed = true; } } @Override public void onNothingSelected(final AdapterView<?> adapterView) { Log.d("AppLog", "onNothingSelected"); if (!isSpinnerClosed) { Log.d("AppLog", "open->closed"); isSpinnerClosed = true; } } }); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner2.setAdapter(dataAdapter); } @Override public void onWindowFocusChanged(final boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && isSpinnerClosed) { Log.d("AppLog", "open->closed"); isSpinnerClosed = true; } } }