প্রাথমিক পাঠ্য "একটি নির্বাচন করুন" দিয়ে একটি Android স্পিনার কীভাবে তৈরি করবেন?


569

আমি একটি স্পিনার ব্যবহার করতে চাই যা প্রাথমিকভাবে (যখন ব্যবহারকারী এখনও কোনও নির্বাচন করেনি) পাঠ্যটি "একটি নির্বাচন করুন" প্রদর্শন করে। ব্যবহারকারী স্পিনারে ক্লিক করলে আইটেমের তালিকা প্রদর্শিত হয় এবং ব্যবহারকারী বিকল্পগুলির মধ্যে একটি নির্বাচন করে। ব্যবহারকারী একটি নির্বাচন করার পরে, নির্বাচিত আইটেমটি "একটি নির্বাচন করুন" এর পরিবর্তে স্পিনারে প্রদর্শিত হবে।

স্পিনার তৈরি করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে:

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

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

আমি কিভাবে এই সমস্যা ঠিক করতে পারবো?


6
এই প্রশ্নে নির্ভুল সমাধান মিথ্যা: stackoverflow.com/questions/9863378/... শুধু getDropDownView () মেথড অগ্রাহ্য করে।
সৌরব শর্মা

আপনি কি নিজের অ্যাডাপ্টারের প্রথম উপাদানটিকে "একটি নির্বাচন করুন" এ সেট করার চেষ্টা করেছেন?
ইগোরগানাপলস্কি

[এখানে অন্যান্য মহান চমৎকার সমাধান!] [1] [1]: stackoverflow.com/questions/9863378/...
AirtonCarneiro

পুনরায় ব্যবহারযোগ্য স্পিনার: github.com/henrychuangtw/ রিউজস্পিনার
হেনরিচুয়াং

android--code.blogspot.in/2015/08/android-spinner-hint.html আর একটি ভাল টিউটোরিয়াল
প্রবস

উত্তর:


255

এখানে একটি সাধারণ সমাধান যা ভিউটিকে ওভাররাইড করে Spinner। এটি setAdapter()প্রাথমিক অবস্থান -1 এ সেট করতে ওভাররাইড করে এবং SpinnerAdapter0 এর চেয়ে কম অবস্থানের জন্য প্রম্পট স্ট্রিংটি সরবরাহ করার জন্য সরবরাহিত প্রক্সিগুলি ।

এটি অ্যান্ড্রয়েড 1.5 এ 4.2 এর মাধ্যমে পরীক্ষা করা হয়েছে তবে ক্রেতা সাবধান! কারণ এই সমাধানটি ব্যক্তিগত কল করার জন্য প্রতিবিম্বের উপর নির্ভর করে AdapterView.setNextSelectedPositionInt()এবং AdapterView.setSelectedPositionInt()এটি ভবিষ্যতের ওএস আপডেটগুলিতে কাজ করার গ্যারান্টিযুক্ত নয়। এটি সম্ভবত বলে মনে হয় তবে এটি কোনওভাবেই গ্যারান্টিযুক্ত নয়।

সাধারণত আমি এ জাতীয় কিছু সমর্থন করি না, তবে এই প্রশ্নটি যথেষ্ট সময় জিজ্ঞাসা করা হয়েছে এবং এটি একটি যুক্তিসঙ্গত পর্যায়ে অনুরোধ বলে মনে হয় যা আমি ভেবেছিলাম আমার সমাধান পোস্ট করব।

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

7
@ এমএমবিআই ব্যবহারকারী সেট আপ করার পরে কীভাবে নির্বাচনটি সাফ করবেন আপনার কোনও ধারণা আছে? আমি দুটি সাগরের () কলকে একটি ক্লিয়ারসিলেশন () পদ্ধতিতে রিফ্যাক্টর করার চেষ্টা করেছি, তবে এটি আসলে কার্যকর হয় না। যদিও পপআপ তালিকাটি পূর্বে নির্বাচিত আইটেমটি অপ-নির্বাচিত হিসাবে দেখায়, তবুও স্পিনার উইজেটটি এটি নির্বাচিত হিসাবে দেখায় এবং ব্যবহারকারী যদি একই আইটেমটি আবার নির্বাচন করে, অন আইটেমসিলিগ্রেটেড () বলা হয় না।
কিওয়ারটি

3
কেউ কেউ কীভাবে উপরের ক্লাসটি ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন?
বিশান

4
এই দ্রবণটি অ্যান্ড্রয়েড: এন্ট্রিগুলি ব্যবহার করে অ্যান্ড্রয়েড ৪.২ (সায়ানোজেনমড 10.1) এ 100% নিখুঁত নয়। স্ফীত টেক্সটভিউয়ের উচ্চতা ডিফল্ট অ্যাডাপ্টারের ইনফ্লেটগুলির যেকোনো সংস্থান থেকে উচ্চতা কম হয় smaller সুতরাং, যখন আপনি প্রকৃতপক্ষে কোনও বিকল্প নির্বাচন করেন তখন উচ্চতা বৃদ্ধি পায়, আমার গ্যালাক্সি এস-তে 10 ডলার, যা গ্রহণযোগ্য নয়। আমি বেশ কয়েকটি জিনিস চেষ্টা করেছি (মাধ্যাকর্ষণ, প্যাডিং, মার্জিন, ইত্যাদি) এবং কোনওটিই ডিভাইসগুলিতে নির্ভরযোগ্যভাবে কাজ করে না, তাই আমি একটি আলাদা সমাধান বেছে নিতে চলেছি।
ম্যারাগুজ

3
@ ডেভিডডোরিয়া আপনাকে আপনার লেআউট ফাইলে নোডিফল্টস্পিনার ক্লাসটি ব্যবহার করতে হবে। আপনার প্রকল্পে উপরের উত্সটি অনুলিপি করুন, যেমন প্যাকেজ com.example.customviews এ। এখন আপনার লেআউট এক্সএমএলে <স্পিনার ...> এর পরিবর্তে <com.example.customviews.NoDefaultSpinner ...> কোডটি বাকি থাকতে পারে। আপনার লেআউটে <com.example.customviews.NoDefaultSpinner> ভিউতে অ্যান্ড্রয়েড: প্রম্পট বৈশিষ্ট্য যুক্ত করতে ভুলবেন না।
Ridcully

2
@ এমএমবি স্পিনারব্র্যান্ড.সেটস্লেশন (-১); কাজ করছে না
শচীন সি

291

আপনি যা করতে পারেন তা হ'ল আপনার সাজসজ্জা SpinnerAdapter সাথে একটি সাজান যা একটি 'নির্বাচন বিকল্প নির্বাচন ...' উপস্থাপন করে স্পিনারকে নির্বাচিত কিছুই না দিয়ে প্রদর্শন করার জন্য প্রাথমিকভাবে দেখুন।

এখানে অ্যান্ড্রয়েড ২.৩ এবং ৪.০ এর জন্য পরীক্ষিত একটি কার্যকারী উদাহরণ রয়েছে (এটি সামঞ্জস্য গ্রন্থাগারে কোনও কিছুই ব্যবহার করে না, তাই এটি কিছুক্ষণের জন্য ভাল হওয়া উচিত) যেহেতু এটি একটি সজ্জাকারক, তাই বিদ্যমান কোডটি পুনঃনির্মাণ করা সহজ হওয়া উচিত এবং এটি CursorLoaderএর ক্ষেত্রেও সূক্ষ্মভাবে কাজ করে । ( cursorAdapterঅবশ্যই আবৃত উপর কার্সার অদলবদল করুন ...)

একটি অ্যান্ড্রয়েড বাগ রয়েছে যা এটি পুনরায় ব্যবহারের দর্শনগুলিকে সামান্য কঠিন করে তোলে। (সুতরাং আপনার সঠিক setTagকিনা তা নিশ্চিত করতে আপনাকে বা অন্য কিছু ব্যবহার করতে হবে convertView)) স্পিনার একাধিক দর্শন প্রকারকে সমর্থন করে না

কোড নোট: 2 কনস্ট্রাক্টর

এটি আপনাকে একটি স্ট্যান্ডার্ড প্রম্পট ব্যবহার করতে বা আপনার নিজের 'নির্বাচিত কিছুই না' প্রথম সারিতে বা উভয়ই বা কোনও হিসাবে নির্ধারণ করতে দেয় allows (দ্রষ্টব্য: কিছু থিম সংলাপের পরিবর্তে স্পিনারের জন্য একটি ড্রপডাউন দেখায় D ড্রপডাউন সাধারণত প্রম্পটটি দেখায় না)

আপনি প্রম্পটের মতো 'চেহারা' হিসাবে একটি বিন্যাস সংজ্ঞায়িত করেন, উদাহরণস্বরূপ, ধূসর ...

প্রাথমিক কিছুই নির্বাচিত হয়নি

একটি স্ট্যান্ডার্ড প্রম্পট ব্যবহার করুন (লক্ষ্য করুন যে কোনও কিছুই নির্বাচিত নয়):

একটি স্ট্যান্ডার্ড প্রম্পট সহ

বা একটি প্রম্পট এবং গতিশীল কিছু দিয়ে (কোন প্রম্পটও থাকতে পারে):

প্রম্পট এবং কিছুই নির্বাচিত সারি

উপরের উদাহরণ ব্যবহার করুন

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setPrompt("Select your favorite Planet!");

spinner.setAdapter(
      new NothingSelectedSpinnerAdapter(
            adapter,
            R.layout.contact_spinner_row_nothing_selected,
            // R.layout.contact_spinner_nothing_selected_dropdown, // Optional
            this));

contact_spinner_row_nothing_selected.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/spinnerItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:textSize="18sp"
    android:textColor="#808080"
    android:text="[Select a Planet...]" />

NothingSelectedSpinnerAdapter.java

import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.SpinnerAdapter;

/**
 * Decorator Adapter to allow a Spinner to show a 'Nothing Selected...' initially
 * displayed instead of the first choice in the Adapter.
 */
public class NothingSelectedSpinnerAdapter implements SpinnerAdapter, ListAdapter {

    protected static final int EXTRA = 1;
    protected SpinnerAdapter adapter;
    protected Context context;
    protected int nothingSelectedLayout;
    protected int nothingSelectedDropdownLayout;
    protected LayoutInflater layoutInflater;

    /**
     * Use this constructor to have NO 'Select One...' item, instead use
     * the standard prompt or nothing at all.
     * @param spinnerAdapter wrapped Adapter.
     * @param nothingSelectedLayout layout for nothing selected, perhaps
     * you want text grayed out like a prompt...
     * @param context
     */
    public NothingSelectedSpinnerAdapter(
      SpinnerAdapter spinnerAdapter,
      int nothingSelectedLayout, Context context) {

        this(spinnerAdapter, nothingSelectedLayout, -1, context);
    }

    /**
     * Use this constructor to Define your 'Select One...' layout as the first
     * row in the returned choices.
     * If you do this, you probably don't want a prompt on your spinner or it'll
     * have two 'Select' rows.
     * @param spinnerAdapter wrapped Adapter. Should probably return false for isEnabled(0)
     * @param nothingSelectedLayout layout for nothing selected, perhaps you want
     * text grayed out like a prompt...
     * @param nothingSelectedDropdownLayout layout for your 'Select an Item...' in
     * the dropdown.
     * @param context
     */
    public NothingSelectedSpinnerAdapter(SpinnerAdapter spinnerAdapter,
            int nothingSelectedLayout, int nothingSelectedDropdownLayout, Context context) {
        this.adapter = spinnerAdapter;
        this.context = context;
        this.nothingSelectedLayout = nothingSelectedLayout;
        this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public final View getView(int position, View convertView, ViewGroup parent) {
        // This provides the View for the Selected Item in the Spinner, not
        // the dropdown (unless dropdownView is not set).
        if (position == 0) {
            return getNothingSelectedView(parent);
        }
        return adapter.getView(position - EXTRA, null, parent); // Could re-use
                                                 // the convertView if possible.
    }

    /**
     * View to show in Spinner with Nothing Selected
     * Override this to do something dynamic... e.g. "37 Options Found"
     * @param parent
     * @return
     */
    protected View getNothingSelectedView(ViewGroup parent) {
        return layoutInflater.inflate(nothingSelectedLayout, parent, false);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        // Android BUG! http://code.google.com/p/android/issues/detail?id=17128 -
        // Spinner does not support multiple view types
        if (position == 0) {
            return nothingSelectedDropdownLayout == -1 ?
              new View(context) :
              getNothingSelectedDropdownView(parent);
        }

        // Could re-use the convertView if possible, use setTag...
        return adapter.getDropDownView(position - EXTRA, null, parent);
    }

    /**
     * Override this to do something dynamic... For example, "Pick your favorite
     * of these 37".
     * @param parent
     * @return
     */
    protected View getNothingSelectedDropdownView(ViewGroup parent) {
        return layoutInflater.inflate(nothingSelectedDropdownLayout, parent, false);
    }

    @Override
    public int getCount() {
        int count = adapter.getCount();
        return count == 0 ? 0 : count + EXTRA;
    }

    @Override
    public Object getItem(int position) {
        return position == 0 ? null : adapter.getItem(position - EXTRA);
    }

    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public long getItemId(int position) {
        return position >= EXTRA ? adapter.getItemId(position - EXTRA) : position - EXTRA;
    }

    @Override
    public boolean hasStableIds() {
        return adapter.hasStableIds();
    }

    @Override
    public boolean isEmpty() {
        return adapter.isEmpty();
    }

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        adapter.registerDataSetObserver(observer);
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        adapter.unregisterDataSetObserver(observer);
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return position != 0; // Don't allow the 'nothing selected'
                                             // item to be picked.
    }

}

52
এটি সমস্যার একটি মার্জিত সমাধান। কোড আমার প্রকল্পে অনুলিপি করা ঠিক ঠিক মতো কাজ করে। কোন প্রতিবিম্ব জন্য প্রয়োজন।
রিচার্ড লে ম্যাসুরিয়ার

2
এটি একটি দুর্দান্ত সমাধান। যদি কেউ জানতে চান যে কীভাবে শিরোনামটিকে ওভাররাইড করা যায় কেবল কোনও আইটেম বাছাইয়ের আগেই নয়, তবে সর্বদা, getView () কলটিতে, কেবলমাত্র সর্বদা getNothingSelectedView (বা অন্য কোনও কাস্টম ভিউ) ফিরিয়ে দিন। ড্রপডাউন তালিকাটি এখনও আপনার অ্যাডাপ্টারের আইটেমগুলির সাথে পপুলেশন করা হবে তবে আপনি এখন কিছু শুরুর পরে শিরোনামও নিয়ন্ত্রণ করতে পারবেন something
ওল্ডস্কুল 4664

6
এটি এমন একটি সমস্যার সত্যিই মার্জিত সমাধান যা বিদ্যমান না হওয়া উচিত (আইফোন বিকাশের চেষ্টা করুন)। দুর্দান্ত এবং ধন্যবাদ! খুশি যে
কারওর মতো

3
@ প্রশান্তোবস্তি, কোডটি ললিপপের সাথে কাজ করার জন্য আপডেট করা হয়েছিল। বিশেষত getItemViewType () এবং getViewTypeCount () পান।
অ্যারোনভার্গাস

3
@ অ্যারোনভার্গাস একবার স্পিনার থেকে কোনও আইটেম নির্বাচন করেছেন আমি কি পূর্বাবস্থায় ফিরে এসে "[কোনও গ্রহ নির্বাচন করুন]" নির্বাচন করতে পারি?
মোদাবেচাম

130

আমি একটি Buttonপরিবর্তে ব্যবহার করে শেষ । A যখন Buttonনা হয় Spinnerতবে আচরণটি কাস্টমাইজ করা সহজ।

প্রথমে যথারীতি অ্যাডাপ্টার তৈরি করুন:

String[] items = new String[] {"One", "Two", "Three"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_dropdown_item, items);

নোট করুন যে আমি simple_spinner_dropdown_itemলেআউট আইডি হিসাবে ব্যবহার করছি । সতর্কতা ডায়ালগ তৈরি করার সময় এটি আরও ভাল চেহারা তৈরি করতে সহায়তা করবে।

আমার বোতামটির জন্য অনক্লিক হ্যান্ডলারে:

public void onClick(View w) {
  new AlertDialog.Builder(this)
  .setTitle("the prompt")
  .setAdapter(adapter, new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {

      // TODO: user specific action

      dialog.dismiss();
    }
  }).create().show();
}

এবং এটাই!


10
আমি এই উত্তরের সাথে একমত এছাড়াও, একটি স্পিনারের চেয়ে স্টাইল করা অনেক সহজ একটি বোতাম।
রোমেন পাইল

@ এইচআরজে আমি আপনার পরামর্শ মতো পদ্ধতি প্রয়োগ করেছি, তবে যা আইটেমটি আগে নির্বাচিত হয়েছে তা হাইলাইট হচ্ছে না (মানে রেডিও বোতামটি মাঝখানে গ্রীন ডট দিয়ে হাইলাইট করা উচিত) .... কীভাবে আমি অনক্লিক () পদ্ধতিতে এটি অর্জন করতে পারি? বোতাম। অনুগ্রহ করে আমাকে এইচআরজে সাহায্য করুন .....
অবধানী ই

2
এই লেআউটের সাথে বোতামটি নিখুঁত <বাটন অ্যান্ড্রয়েড: আইডি = "@ + আইডি / শহর" অ্যান্ড্রয়েড: লেআউট_উইথথ = "ম্যাচ_প্যারেন্ট" অ্যান্ড্রয়েড: বিন্যাস_ উচ্চতা = "র‌্যাপ_কন্টেন্ট" অ্যান্ড্রয়েড: বিন্যাস_মার্জিন = "5 ডিপি" অ্যান্ড্রয়েড: মাধ্যাকর্ষণ = "বাম" অ্যান্ড্রয়েড: পটভূমি = "@ অ্যান্ড্রয়েড: অঙ্কনযোগ্য / বিটিএন_প্রডাউন" অ্যান্ড্রয়েড: পাঠ্য = "@ স্ট্রিং / শহর_প্রম্পট" />
কিমিএল_কার

তারপরে আপনি কীভাবে বাটনটির পাঠ্যটিকে আপডেট হিসাবে নির্বাচন প্রতিফলিত করবেন, যেমনটি কোনও স্পিনারে ঘটবে?
শিম

3
সমস্যার সমাধান: সেটএডাপ্টারের পরিবর্তে সেটসিংজল চয়েসআইটেম ব্যবহার করুন
দেব

67

প্রথমত, আপনি শ্রেণীর promptবৈশিষ্ট্যে আগ্রহী হতে পারেন Spinner। নীচের ছবিটি দেখুন, "একটি প্ল্যানেট চয়ন করুন" এমন প্রম্পট যা XML এ সেট করা যেতে পারে android:prompt=""

এখানে চিত্র বর্ণনা লিখুন

আমি সাবক্লাসিংয়ের পরামর্শ দিতে যাচ্ছি Spinner, যেখানে আপনি অভ্যন্তরীণভাবে দুটি অ্যাডাপ্টার বজায় রাখতে পারেন। একটি অ্যাডাপ্টারের সাথে "সিলেক্ট ওয়ান" বিকল্প রয়েছে এবং অন্য আসল অ্যাডাপ্টার (প্রকৃত বিকল্পগুলির সাথে) রয়েছে, তারপরে OnClickListenerপছন্দগুলি ডায়ালগটি দেখানোর আগে অ্যাডাপ্টারগুলিতে স্যুইচ করতে ব্যবহার করুন । যাইহোক, এই ধারণাটি বাস্তবায়নের চেষ্টা করার পরে আমি এই সিদ্ধান্তে পৌঁছেছি আপনি OnClickউইজেটের জন্য ইভেন্টগুলি গ্রহণ করতে পারবেন না ।

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

আপনার কি সত্যিই "সিলেক্ট ওয়ান" প্রদর্শন করা দরকার?


36
এটি কেবল "সিলেক্ট ওয়ান" দেখানোর প্রয়োজনের বিষয় নয়, এটি স্পিনারের মান optionচ্ছিকভাবে ফাঁকা রেখে দেওয়ার ক্ষেত্রেও সম্বোধন করে।
গ্রেগ 7gkb

5
এছাড়াও, এই বিকল্পের সাথে, পৃথিবী স্পিনারের উপর নির্বাচন হিসাবে কোনও কিছু বাছাইয়ের আগে দেখানো হয়েছে, আমার অ্যাপ্লিকেশনটির জন্য আমি বরং ব্যবহারকারীরা বলতে পারেন যে তারা এখনও কিছু চয়ন করেন নি
ডিলান মুরফি

2
এটি সত্যিই প্রশ্নের উত্তর দেয় না। মানুষ গ্রহের তালিকার প্রথম আইটেমের চেয়ে ডিফল্ট শো "সিলেক্ট ওয়ান" দ্বারা স্পিনারকে নিজেই রাখার উপায় খুঁজছেন, উদাহরণস্বরূপ
জেএমআরবুস্তি

57

এই কোডটি পরীক্ষা করা হয়েছে এবং অ্যান্ড্রয়েড ৪.৪ এ কাজ করে

এখানে চিত্র বর্ণনা লিখুন

Spinner spinner = (Spinner) activity.findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_spinner_dropdown_item) {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                View v = super.getView(position, convertView, parent);
                if (position == getCount()) {
                    ((TextView)v.findViewById(android.R.id.text1)).setText("");
                    ((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount())); //"Hint to be displayed"
                }

                return v;
            }       

            @Override
            public int getCount() {
                return super.getCount()-1; // you dont display last item. It is used as hint.
            }

        };

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adapter.add("Daily");
        adapter.add("Two Days");
        adapter.add("Weekly");
        adapter.add("Monthly");
        adapter.add("Three Months");
        adapter.add("HINT_TEXT_HERE"); //This is the text that will be displayed as hint.


        spinner.setAdapter(adapter);
        spinner.setSelection(adapter.getCount()); //set the hint the default selection so it appears on launch.
        spinner.setOnItemSelectedListener(this);

getItem(getCount())আমার জন্য লাল রেখাযুক্ত? পদ্ধতি সেট হিন্ট সমাধান করতে পারে না
জাপানোলজিকা

আমার একটি সন্দেহ আছে, এই থ্রেডে অনেকগুলি সমাধান দেখেছি..কিন্তু কেন সকলেই শেষের দিকে ইঙ্গিত যুক্ত করছে। প্রথম সারিতে ইঙ্গিত যুক্ত করা কি ভুল?
আকাশপাত্র

আমি 'setOnItemSelectedListener (এটি) সেট করতে পারি না;' যে কারণে আমি 'প্রয়োগসমূহ নেভিগেশনভিউ.অন নেভিগেশনআইটেমসিলেক্টডলাইস্টেনার' ব্যবহার করছি, আমি কি 'সেটঅনটাইমসিলেক্টলাইস্টেনার (এটি) অপসারণ করতে পারি;' কোন সমস্যা ছাড়াই?
সিজিআর

@ কাশপাত্র তারা শেষের দিকে ইঙ্গিত যুক্ত করার কারণ হ'ল স্পিনারের জন্য অ্যারেএডাপ্টার রান সময়ে বিভিন্ন উত্স থেকে এর মান পেতে পারে।
VinKrish

এই সত্যিই আমাকে সাহায্য
সুনীল

31

আমি এই সমাধানটি পেয়েছি:

String[] items = new String[] {"Select 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);

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
        items[0] = "One";
        selectedItem = items[position];
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    }
});

স্রেফ [0] অ্যারে পরিবর্তন করুন "ওয়ান সিলেক্ট" দিয়ে এবং তারপরে অন আইটেমলেসডে, এর নাম পরিবর্তন করে "ওয়ান" করুন।

উত্কৃষ্ট সমাধান নয়, তবে এটি কাজ করে: ডি


5
এটি আমার পক্ষে কার্যকর হয়নি। আইটেম "ওয়ান" চয়ন করার পরে এটি এখনও "নির্বাচন করুন" বলেছে says
লিও ল্যান্ডাউ

আইটেমসিলেক্টড ইন্টারফেসটি এই কাজটির কারণ হিসাবে সর্বদা প্রথমবারের জন্য কল করবে।
বৈভব কদম

20

স্পিনারে ইঙ্গিত সেট করতে কোনও ডিফল্ট API নেই। এটি যুক্ত করতে আমাদের সুরক্ষার প্রতিচ্ছবি বাস্তবায়ন নয় এমন একটি ছোট কাজের প্রয়োজন

List<Object> objects = new ArrayList<Object>();
objects.add(firstItem);
objects.add(secondItem);
// add hint as last item
objects.add(hint);

HintAdapter adapter = new HintAdapter(context, objects, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Spinner spinnerFilmType = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);

// show hint
spinner.setSelection(adapter.getCount());

অ্যাডাপ্টারের উত্স:

public class HintAdapter
        extends ArrayAdapter<Objects> {

    public HintAdapter(Context theContext, List<Object> objects) {
        super(theContext, android.R.id.text1, android.R.id.text1, objects);
    }

    public HintAdapter(Context theContext, List<Object> objects, int theLayoutResId) {
        super(theContext, theLayoutResId, android.R.id.text1, objects);
    }

    @Override
    public int getCount() {
        // don't display last item. It is used as hint.
        int count = super.getCount();
        return count > 0 ? count - 1 : count;
    }
}

মূল উৎস


R.id.text1 কি? এটা কোন বিন্যাস বা দেখুন? দয়া করে আপনার উত্তরটি বিস্তারিতভাবে বর্ণনা করুন
আনন্দ সাবজনী

এটি হওয়া উচিতandroid.R.id.text1
ইয়াকিভ মস্কান

আমার একটি সন্দেহ আছে, এই থ্রেডে অনেকগুলি সমাধান দেখেছি..কিন্তু কেন সকলেই শেষের দিকে ইঙ্গিত যুক্ত করছে। প্রথম সারিতে ইঙ্গিত যুক্ত করা কি ভুল?
আকাশপাত্র

@কাশপত্রে আমার ঠিক মনে নেই, তবে মনে হচ্ছে এটি প্রথম আইটেমের তালিকা হিসাবে তৈরি করার চেষ্টা করার পরে কিছু সমস্যা হয়েছিল। যাইহোক আপনি সর্বদা এটি চেষ্টা করতে পারেন এবং এখানে মন্তব্য করতে পারেন, এখানে সমস্ত যাদু getCountপদ্ধতি অনুসারে
ইয়াকিভ মস্কান

@ ইয়াকিওমোস্পান যখন আমি এটি ব্যবহার করি তখন আমি একটি এনপিই পাই, সম্ভবত প্রোগার্ড ব্যবহার করার সময় প্রতিচ্ছবি হওয়ার কারণে। আপনি এই স্থির করা কি জানেন কিভাবে?
অ্যালান

17

এখানে প্রচুর উত্তর তবে আমি আশ্চর্য হয়েছি যে কেউই সহজ সমাধানের পরামর্শ দেয় না: স্পিনারের উপরে একটি পাঠ্যদর্শন রাখুন। টেক্সটভিউতে একটি ক্লিক শ্রোতা সেট করুন যা পাঠ্যদর্শনটি স্পিনার দেখায় এবং স্পিনার.পারফর্মক্লিক () কল করে।


9

আমি খালি নির্বাচন সহ স্পিনারের জন্য একই সমস্যা পেয়েছি এবং এর থেকে আরও ভাল সমাধান খুঁজে পেয়েছি। এই সাধারণ কোডটি দেখুন।

Spinner lCreditOrDebit = (Spinner)lCardPayView.findViewById(R.id.CARD_TYPE);
spinneradapter lAdapter = 
  new spinneradapter(
    BillPayScreen.this, 
    ndroid.R.layout.simple_spinner_item,getResources().getStringArray(R.array.creditordebit));
lAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
lCreditOrDebit.setAdapter(lAdapter);

এখানে স্পিনেরাদাপ্টার হল অ্যারেডাপ্টারের জন্য একটি ছোট কাস্টমাইজেশন। দেখে মনে হচ্ছে:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

public class spinneradapter extends ArrayAdapter<String>{
    private Context m_cContext;
    public spinneradapter(Context context,int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
        this.m_cContext = context;
    }

    boolean firsttime = true;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(firsttime){
            firsttime = false;
            //Just return some empty view
            return new ImageView(m_cContext);
        }
        //Let the array adapter take care of it this time.
        return super.getView(position, convertView, parent);
    }
}

6
এই পদ্ধতির সমস্যাটি হ'ল তালিকাটি পপ আপ হওয়ার পরে এটি তালিকার প্রথম আইটেমটি নির্বাচন করে। কারণ এটি ইতিমধ্যে নির্বাচিত হয়েছে আপনি এটি নির্বাচন করতে এটি স্পর্শ করতে পারবেন না - এটি এমন কাজ করে যাতে কোনও নির্বাচিত ঘটনা ঘটে না।
জাওয়াদস্যাক

7

আপনি এটি একটি পাঠ্য দৃশ্যে পরিবর্তন করতে পারেন এবং এটি ব্যবহার করতে পারেন:

android:style="@android:style/Widget.DeviceDefault.Light.Spinner"

এবং তারপরে android:textসম্পত্তি নির্ধারণ করুন ।


কেবলমাত্র 14 এবং ততোধিকের জন্য কাজ করে।
জিউলিও পিয়ানোস্টেলি

6

এক্সএমএল ফাইল:

<Spinner android:id="@+id/locationSpinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:prompt="@string/select_location" />

কার্যক্রম:

private Spinner featuresSelection;
private ArrayAdapter<CharSequence> featuresAdapter;
private List<CharSequence> featuresList;

onCreate:

featuresList = new ArrayList<CharSequence>();
featuresAdapter = new ArrayAdapter<CharSequence>(this,
  android.R.layout.simple_spinner_item, featuresList);
featuresAdapter.setDropDownViewResource(
  android.R.layout.simple_spinner_dropdown_item);
featuresSelection = ((Spinner) yourActivity.this
  .findViewById(R.id.locationSpinner));
featuresSelection.setAdapter(featuresAdapter);
featuresSelection.setOnItemSelectedListener(
  new MyOnItemSelectedListener());

কিছু ফাংশন (প্রোগ্রামক্রমে অ্যাডাপ্টারে জিনিস যুক্ত করুন)>

featuresAdapter.add("some string");

এখন আপনার একটি খালি স্পিনার রয়েছে এবং আপনি খালি থাকলে ডায়ালগটি না খোলার জন্য কোড লিখতে পারেন। অথবা তারা ফিরে টিপতে পারেন। তবে আপনি রান সময় চলাকালীন কোনও ফাংশন বা অন্য তালিকার সাহায্যে এটিকে জনপ্রিয় করে তোলেন।


এছাড়াও ডেটাসেটচেন্জড () এটি জানানোর প্রয়োজন নেই কারণ এটি ডিফল্টরূপে সত্যতে সেট করা উচিত।
ট্রাগ্রগলিয়া

4

আমি নীচের মত চেষ্টা করেছি। একটি বোতাম নিন এবং ক্লিক ইভেন্টটি এটি দিন। বোতামের পটভূমি পরিবর্তন করে, এটি একজন স্পিনার বলে মনে হচ্ছে।

গ্লোবাল ভেরিয়েবল অ্যালার্টডায়ালগ এবং ডিফল্ট মান হিসাবে ঘোষণা করুন ..

AlertDialog d;
static int default_value = 0;
final Button btn = (Button) findViewById(R.id.button1);
btn .setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v)
{
    //c.show();
    final CharSequence str[] = {"Android","Black Berry","Iphone"};
        AlertDialog.Builder builder =
          new AlertDialog.Builder(TestGalleryActivity.this).setSingleChoiceItems(
            str, default_value,new  DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int position)
            {
                Toast.makeText(TestGalleryActivity.this,
                               "" + position,
                               Toast.LENGTH_SHORT).show();
                default_value = position;
                btn.setText(str[position]);
                if(d.isShowing())
                    d.dismiss();
            }
        }).setTitle("Select Any");
        d = builder.create();
        d.show();
    }
});

4

এটা আমার পথ:

List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string2");
list.add("string3");
list.add("[Select one]");
final int listsize = list.size() - 1;
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list) {
 @Override
public int getCount() {
    return(listsize); // Truncate the list
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);

mySpinner.setSelection(listsize); // Hidden item to appear in the spinner

এটি নীচের অবস্থানে
স্পিনারটি খুলবে

3

তালিকার শীর্ষে কোনও উপাদান যুক্ত করার জন্য সাধারণ উদ্দেশ্যে সমাধানের জন্য আইওএসড অ্যাপটি দেখুন। বিশেষত, আপনি যদি কার্সারএডাপ্টার ব্যবহার করছেন তবে ট্র্যাকসএডাপ্টার.জভা দেখুন যা সংজ্ঞা উপরের অতিরিক্ত আইটেম সঙ্গে মোকাবিলা করার জন্য তালিকা গণনা পরিচালনা করতে একটি "setHasAllItem" পদ্ধতি এবং সংশ্লিষ্ট কোড প্রদান প্রযোজ্য হইবে।

কাস্টম অ্যাডাপ্টার ব্যবহার করে আপনি পাঠ্যটিকে "একটি বাছাই করুন" বা আপনি যে শীর্ষ আইটেমটি বলতে চান তা নির্ধারণ করতে পারেন।


3

আমার মেইন.এক্সএমএল এ আমার একটি স্পিনার রয়েছে এবং এটির আইডি @+id/spinner1

আমি আমার অনক্রিয়েট ফাংশনে এটি লিখি:

spinner1 = (Spinner)this.findViewById(R.id.spinner1);
final String[] groupes = new String[] {"A", "B", "C", "D", "E", "F", "G", "H"};
ArrayAdapter<CharSequence> featuresAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, new ArrayList<CharSequence>());
featuresAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(featuresAdapter);
for (String s : groupes) featuresAdapter.add(s);

spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
     public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
         // Here go your instructions when the user chose something
         Toast.makeText(getBaseContext(), groupes[position], 0).show();
     }
     public void onNothingSelected(AdapterView<?> arg0) { }
});

এটি ক্লাসে কোনও প্রয়োগের প্রয়োজন নেই।


3

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

সুতরাং আমি ইঙ্গিতটি আইটেমটি তালিকার শুরুতে রেখেছি। এবং ড্রপ-ডাউন তালিকায় প্রথম আইটেমটি লুকান।

private void loadSpinner(){

    HintArrayAdapter hintAdapter = new HintArrayAdapter<String>(context, 0);

    hintAdapter.add("Hint to be displayed");
    hintAdapter.add("Item 1");
    hintAdapter.add("Item 2");
            .
            .
    hintAdapter.add("Item 30");

    spinner1.setAdapter(hintAdapter);

    //spinner1.setSelection(0); //display hint. Actually you can ignore it, because the default is already 0
    //spinner1.setSelection(0, false); //use this if don't want to onItemClick called for the hint

    spinner1.setOnItemSelectedListener(yourListener);
}

private class HintArrayAdapter<T> extends ArrayAdapter<T> {

    Context mContext;

    public HintArrayAdapter(Context context, int resource) {
        super(context, resource);
        this.mContext = context
    }

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(android.R.layout.simple_spinner_item, parent, false);
        TextView texview = (TextView) view.findViewById(android.R.id.text1);

        if(position == 0) {
            texview.setText("");
            texview.setHint(getItem(position).toString()); //"Hint to be displayed"
        } else {
            texview.setText(getItem(position).toString());
        }

        return view;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view;

        if(position == 0){
            view = inflater.inflate(R.layout.spinner_hint_list_item_layout, parent, false); // Hide first row
        } else {
            view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
            TextView texview = (TextView) view.findViewById(android.R.id.text1);
            texview.setText(getItem(position).toString());
        } 

        return view;
    }
}

প্রথম ইঙ্গিত সারিটি লুকানোর জন্য অবস্থান 0 হলে @ ওভাররাইড getDropDownView () এ নীচের লেআউটটি সেট করুন।

R.layout.spinner_hint_list_item_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

</LinearLayout>

3

এছাড়াও, ডিফল্ট দেখানোর জন্য একটি সাধারণ কৌশল রয়েছে:

আপনি আপনার তালিকায় একটি ডিফল্ট মান যুক্ত করতে পারেন এবং তারপরে ব্যবহার করে আপনার সমস্ত সংগ্রহ যুক্ত করতে পারেন list.addAll(yourCollection);

কার্যক্ষম কোডের নমুনা এখানে:

List<FuelName> fuelList = new ArrayList<FuelName>();
                    fuelList.add(new FuelName(0,"Select One"));
                    fuelList.addAll(response.body());
                    ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, fuelList);
                    //fuelName.setPrompt("Select Fuel");
                    fuelName.setAdapter(adapter);

আশা করি এটি আপনার জটিলতা পুনরুদ্ধার করবে। শুভ কোডিং!


2

আমি মনে করি সহজতম উপায়টি সূচকে 0 টি "বেছে নিন" বলে একটি ডামি আইটেম তৈরি করছে এবং তারপরে সংরক্ষণ করার পরে সম্ভবত পরীক্ষাটি 0 নয় তা পরীক্ষা করে দেখুন।


4
আইটেমের তালিকা দেখার বিষয়ে কী? আপনি শীর্ষে "একটি নির্বাচন করুন" অবস্থানটি দেখতে চান? এটি কেবল সংরক্ষণের বিষয় নয়।
Krzysztof Wolny

@ ক্রিজিসটফলনি স্পিনিয়ারটি ডিফল্টরূপে আইটেমটি 0

2

সুতরাং এটি আমার চূড়ান্ত উদাহরণ একটি বোতাম-স্পিনার জন্য "অল-ইন"

ইন activity_my_form.xml

    <Button
        android:id="@+id/btnSpinnerPlanets"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="left|center_vertical"
        android:singleLine="true"
        android:text="@string/selectAPlanet"
        android:textSize="10sp"
        android:background="@android:drawable/btn_dropdown">
    </Button>

ইন strings.xml

<string name="selectAPlanet">Select planet&#8230;</string>

<string-array name="planets__entries">
    <item>The Sun with a name very long so long long long long longThe Sun with a name very long so long long long long longThe Sun with a name very long so long long long long long</item>
    <item>Mercury</item>
    <item>Venus</item>
    <item>Earth</item>
    <item>Mars</item>
    <item>Jupiter</item>
    <item>Saturn</item>
    <item>Uranus</item>
    <item>Neptune</item>
</string-array>

ইন MyFormActivity.java

public class MyFormActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ((Button) findViewById(R.id.btnSpinnerPlanets)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String[] items = view.getResources().getStringArray(R.array.planets__entries);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MyFormActivity.this, android.R.layout.simple_spinner_dropdown_item, items);
                new AlertDialog.Builder(MyFormActivity.this).setTitle("the prompt").setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((Button) findViewById(R.id.btnSpinnerPlanets)).setText(items[which]);
                        dialog.dismiss();
                    }
                }).create().show();
            }
        });     

    }

}   

অবশেষে আমি কোনও ফন্ট সাইজ কনফিগারযোগ্য কোনও প্রথম আইটেম বাছাইযোগ্য বাটন স্পিনার পেয়েছি না !!! ধন্যবাদ এইচআরজেকে


1

যখন ব্যাপ্ত SpinnerAdapter, দুই ওভাররাইড View-producing পদ্ধতি, getView(int, View, ViewGroup)এবং getDropDownView(int, View, ViewGroup)। প্রথমটি নিজের মধ্যে ; Viewোকানো সরবরাহ Spinnerকরে; দ্বিতীয়টি Viewড্রপ-ডাউন তালিকায় সরবরাহ করে (নামটি যেমন বোঝায়)। আপনি getView(...)যাতে ওভাররাইড করতে পারেন যাতে কোনও আইটেম নির্বাচন না করা পর্যন্ত এটি একটি প্রম্পটযুক্ত একটি প্রদর্শন করে TextView; তারপরে, আপনি যখন কোনও আইটেম নির্বাচন করা হয়েছে তা সনাক্ত করেন, আপনি এটির সাথে সম্পর্কিত প্রদর্শন করতে এটি পরিবর্তন করেন TextView

public class PromptingAdapter extends SpinnerAdapter {

    //... various code ...

    private boolean selectionmade = false;

    //call this method from the OnItemSelectedListener for your Spinner
    public setSelectionState(boolean b) {
        selectionmade = b;
    }

    @Override
    public View getView(int position, View recycle, ViewGroup container) {
        if(selectionmade) {
            //your existing code to supply a View for the Spinner
            //you could even put "return getDropDownView(position, recycle, container);"
        }
        else {
            View output;
            if(recycle instanceof TextView) {
                 output = recycle;
            }
            else {
                 output = new TextView();
                 //and layout stuff
            }
            output.setText(R.string.please_select_one);
            //put a string "please_select_one" in res/values/strings.xml
            return output;
        }
    }

//...
}

1
আমি এই পদ্ধতিতে একটি ত্রুটি আবিষ্কার করেছি: স্পিনার স্বয়ংক্রিয়ভাবে অবিলম্বে একটি আইটেম নির্বাচন করে। আমি খুব শীঘ্রই এই এক রাস্তা খুঁজে পাবেন।
অ্যান্ড্রু ওয়াইল্ড

আমি খুব শীঘ্রই কথা বললাম। আমি অবশ্য হাল ছাড়িনি। নোট করুন যে Spinnerটিউটোরিয়াল অনুসারে (যা Toastআপনি কোনও আইটেম নির্বাচন করেছেন তার পরে সম্ভবত এটি প্রদর্শন করে ) এই OUGHT কাজ করতে: ডেভেলপার.অ্যান্ড্রয়েড
অ্যান্ড্রু ওয়াইল্ড

1

জামারিন ব্যবহারকারীদের জন্য, এখানে উপরেরোনভर्गাসের উত্তরের সি # সমতুল্য।

using Android.Content;
using Android.Database;
using Android.Views;
using Android.Widget;
using Java.Lang;

namespace MyNamespace.Droid
{ 
  public class NothingSelectedSpinnerAdapter : BaseAdapter, ISpinnerAdapter, IListAdapter
  {
    protected static readonly int EXTRA = 1;
    protected ISpinnerAdapter adapter;
    protected Context context;
    protected int nothingSelectedLayout;
    protected int nothingSelectedDropdownLayout;
    protected LayoutInflater layoutInflater;

    public NothingSelectedSpinnerAdapter(ISpinnerAdapter spinnerAdapter, int nothingSelectedLayout, Context context) : this(spinnerAdapter, nothingSelectedLayout, -1, context)
    {
    }

    public NothingSelectedSpinnerAdapter(ISpinnerAdapter spinnerAdapter, int nothingSelectedLayout, int nothingSelectedDropdownLayout, Context context)
    {
      this.adapter = spinnerAdapter;
      this.context = context;
      this.nothingSelectedLayout = nothingSelectedLayout;
      this.nothingSelectedDropdownLayout = nothingSelectedDropdownLayout;
      layoutInflater = LayoutInflater.From(context);
    }

    protected View GetNothingSelectedView(ViewGroup parent)
    {
      return layoutInflater.Inflate(nothingSelectedLayout, parent, false);
    }

    protected View GetNothingSelectedDropdownView(ViewGroup parent)
    {
      return layoutInflater.Inflate(nothingSelectedDropdownLayout, parent, false);
    }

    public override Object GetItem(int position)
    {
      return position == 0 ? null : adapter.GetItem(position - EXTRA);
    }

    public override long GetItemId(int position)
    {
      return position >= EXTRA ? adapter.GetItemId(position - EXTRA) : position - EXTRA;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
      // This provides the View for the Selected Item in the Spinner, not
      // the dropdown (unless dropdownView is not set).
      if (position == 0)
      {
        return GetNothingSelectedView(parent);
      }

      // Could re-use the convertView if possible.
      return this.adapter.GetView(position - EXTRA, null, parent);
    }

    public override int Count
    {
      get
      {
        int count = this.adapter.Count;
        return count == 0 ? 0 : count + EXTRA;
      }
    }

    public override View GetDropDownView(int position, View convertView, ViewGroup parent)
    {
      // Android BUG! http://code.google.com/p/android/issues/detail?id=17128 -
      // Spinner does not support multiple view types
      if (position == 0)
      {
        return nothingSelectedDropdownLayout == -1 ?
          new View(context) :
          GetNothingSelectedDropdownView(parent);
      }

      // Could re-use the convertView if possible, use setTag...
      return adapter.GetDropDownView(position - EXTRA, null, parent);
    }

    public override int GetItemViewType(int position)
    {
      return 0;
    }

    public override int ViewTypeCount => 1;

    public override bool HasStableIds => this.adapter.HasStableIds;

    public override bool IsEmpty => this.adapter.IsEmpty;

    public override void RegisterDataSetObserver(DataSetObserver observer)
    {
      adapter.RegisterDataSetObserver(observer);
    }

    public override void UnregisterDataSetObserver(DataSetObserver observer)
    {
      adapter.UnregisterDataSetObserver(observer);
    }

    public override bool AreAllItemsEnabled()
    {
      return false;
    }

    public override bool IsEnabled(int position)
    {
      return position > 0;
    }
  }
}

1

আমি নিম্নলিখিত কোড ব্যবহার করে এই সমস্যাও সমাধান করেছি solved ধরুন আপনার আইটেমের একটি তালিকা রয়েছে যেমন

ArrayList<Item> itemsArrayList = new ArrayList<Item>();
Item item1 = new Item();
item1.setId(1);
item1.setData("First Element");
Item item2 = new Item();
item2.setId(2);
Item2.setData("Second Element");
itemsArrayList.add(item1);
itemsArrayList.add(item2);

এখন আমাদের স্পিনারকে স্ট্রিং সরবরাহ করতে হবে কারণ স্পিনার বিষয়টি বুঝতে পারে না। সুতরাং আমরা এই জাতীয় স্ট্রিং আইটেমগুলির সাথে একটি নতুন অ্যারে তালিকা তৈরি করব

ArrayList<String> itemStringArrayList = new ArrayList<String>();
for(Item item : itemsArrayList) {
    itemStringArrayList.add(item.getData());
}

এখন আমরা itemStringArrayListদুটি স্ট্রিং আইটেম সহ অ্যারে তালিকা আছে । এবং আমাদের প্রথম আইটেম হিসাবে "আইটেম নির্বাচন করুন" পাঠ্যটি প্রদর্শন করতে হবে। সুতরাং আমাদের মধ্যে একটি নতুন স্ট্রিং .োকাতে হবে itemStringArrayList

itemStringArrayList.add("Select Item");

এখন আমাদের একটি অ্যারে তালিকা রয়েছে itemsArrayListএবং আমরা ড্রপ ডাউনতে দুটি উপাদান প্রদর্শন করতে চাই। তবে শর্তটি এখানে ... আমরা যদি কিছু নির্বাচন না করি তবে Select Itemপ্রথম উপাদান হিসাবে উপস্থিত হওয়া উচিত যা সক্ষম হবে না।

সুতরাং আমরা এই মত এই কার্যকারিতা বাস্তবায়ন করতে পারেন। আপনার যদি অ্যান্ড্রয়েড স্পিনারটিতে অ্যারে তালিকা আইটেমগুলি লোড করতে হয়। সুতরাং আপনাকে কিছু অ্যাডাপ্টার ব্যবহার করতে হবে। সুতরাং এখানে আমি ব্যবহার করব ArrayAdapter। আমরা কাস্টমাইজ অ্যাডাপ্টারটিও ব্যবহার করতে পারি।

ArrayAdapter<String> itemsArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.spinner_item, itemsArrayList){
        @Override
        public boolean isEnabled(int position) {
            if(position == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        @Override
        public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
            View view = super.getDropDownView(position, convertView, parent);
            TextView tv = (TextView) view;
            if(position == 0){
                // Set the hint text color gray
                tv.setTextColor(Color.GRAY);
            }
            else {
                tv.setTextColor(Color.BLACK);
            }
            return view;
        }
    };

itemsArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
your_spinner_name.setAdapter(itemsArrayAdapter);

এখানে এই কোড। আমরা কাস্টমাইজড স্পিনার লেআউটটি ব্যবহার করছি R.layout.spinner_item। এটি একটি সাধারণ পাঠ্যদর্শন

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textStyle="italic"
    android:fontFamily="sans-serif-medium"
    />

আমাদের স্পিনারের প্রথম পাঠ্যটি অক্ষম করা দরকার। সুতরাং 0 অবস্থানের জন্য আমরা পাঠ্যটি অক্ষম করছি। এবং রঙ এছাড়াও আমরা getDropDownView পদ্ধতি ওভারাইড করে সেট করতে পারি। সুতরাং এইভাবে আমরা প্রত্যাশিত স্পিনার পাবেন।


0

আমি কেবলমাত্র রেডিওবটনগুলির সাথে একটি রেডিওগ্রুপ ব্যবহার করব যদি আপনার কাছে কেবল তিনটি পছন্দ থাকে তবে আপনি প্রথমে এগুলি সমস্ত পরীক্ষা না করাতে পারেন।


0

পূর্বে জমা দেওয়া কোনও উত্তরই সত্যিই আমি এই সমস্যাটি সমাধান করতে চাইনি worked আমার কাছে আদর্শ সমাধানটি যখন "স্পিনারকে প্রথম প্রদর্শিত হবে তখন" একটি নির্বাচন করুন "(বা প্রাথমিক পাঠ্য যাই হোক না কেন) সরবরাহ করবে। যখন ব্যবহারকারী স্পিনারটিকে টোকা দেয়, প্রাথমিক পাঠ্যটি প্রদর্শিত ড্রপ ডাউনের অংশ হওয়া উচিত নয়।

আমার নির্দিষ্ট পরিস্থিতি আরও জটিল করার জন্য, আমার স্পিনার ডেটা একটি কার্সার আকারে আসছে যা লোডারম্যানেজার কলব্যাকগুলির মাধ্যমে লোড করা হয়।

যথেষ্ট পরীক্ষার পরে আমি নিম্নলিখিত সমাধান নিয়ে এসেছি:

public class MyFragment extends Fragment implements
LoaderManager.LoaderCallbacks<Cursor>{

private static final String SPINNER_INIT_VALUE = "Select A Widget";
private Spinner mSpinner;
private int mSpinnerPosition;
private boolean mSpinnerDropDownShowing = false;
private View mSpinnerDropDown;

private MyCursorAdapter mCursorAdapter;

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
...

mCursorAdapter = new MyCursorAdapter(getActivity());

mSpinner = (Spinner) rootView.findViewById(R.id.theSpinner);
mSpinner.setOnTouchListener(mSpinnerTouchListener);
mSpinner.setAdapter(mCursorAdapter);

...
}

//Capture the touch events to toggle the spinner's dropdown visibility
private OnTouchListener mSpinnerTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if(mSpinnerDropDown != null && mSpinnerDropDownShowing == false){
            mSpinnerDropDownShowing = true;
            mSpinnerDropDown.setVisibility(View.VISIBLE);
        }
        return false;
    }
};

//Capture the click event on the spinner drop down items
protected OnClickListener spinnerItemClick = new OnClickListener(){

    @Override
    public void onClick(View view) {
        String widget = ((TextView) view.findViewById(android.R.id.text1)).getText().toString();

        if(!widget.equals(SPINNER_INIT_VALUE)){
            if(mCursorAdapter != null){
                Cursor cursor = mCursorAdapter.getCursor();
                if(cursor.moveToFirst()){
                    while(!cursor.isAfterLast()){
                        if(widget.equals(cursor.getString(WidgetQuery.WIDGET_NAME))){

                            ...

                            //Set the spinner to the correct item
                            mSpinnerPosition = cursor.getPosition() + 1;
                            mSpinner.setSelection(mSpinnerPosition);
                            break;
                        }
                        cursor.moveToNext();
                    }
                }
            }
        }

        //Hide the drop down. Not the most elegent solution but it is the only way I could hide/dismiss the drop down
        mSpinnerDropDown = view.getRootView();
        mSpinnerDropDownShowing = false;
        mSpinnerDropDown.setVisibility(View.GONE);
    }
};

private class MyCursorAdapter extends CursorAdapter {

    private final int DISPLACEMENT = 1;
    private final int DEFAULT_ITEM_ID = Integer.MAX_VALUE;

    private Activity mActivity;

    public MyCursorAdapter(Activity activity) {
            super(activity, null, false);
            mActivity = activity;
    }

    //When loading the regular views, inject the defualt item
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(position == 0){
            if(convertView == null){
                convertView = mActivity.getLayoutInflater().inflate(R.layout.list_item_widget, parent, false);
            }
            return getDefaultItem(convertView);
        }
        return super.getView(position - DISPLACEMENT, convertView, parent);
    }

    //When loading the drop down views, set the onClickListener for each view
    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent){
        View view = super.getDropDownView(position, convertView, parent);
        view.setOnClickListener(spinnerItemClick);
        return view;
    }

    //The special default item that is being injected
    private View getDefaultItem(View convertView){
        TextView text = (TextView) convertView.findViewById(android.R.id.text1);
        text.setText(SPINNER_INIT_VALUE);
        return convertView;
    }

    @Override
    public long getItemId(int position) {
        if (position == 0) {
            return DEFAULT_ITEM_ID;
        }
        return super.getItemId(position - DISPLACEMENT);
    }

    @Override
    public boolean isEnabled(int position) {
        return position == 0 ? true : super.isEnabled(position - DISPLACEMENT);
    }

    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount() + DISPLACEMENT;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return super.getViewTypeCount();
        }

        return super.getItemViewType(position - DISPLACEMENT);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return mActivity.getLayoutInflater().inflate(R.layout.list_item_widget, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor){

        if(cursor.isAfterLast()){
            return;
        }

        TextView text = (TextView) view.findViewById(android.R.id.text1);
        String WidgetName = cursor.getString(WidgetQuery.WIDGET_NAME);
        text.setText(WidgetName);
    }
}
}

0

আমি স্পিনারের পরিবর্তে একটি বোতাম ব্যবহার করে এটি পরিচালনা করি। আমার গিটহাবে নমুনা প্রকল্প রয়েছে have

প্রকল্পে, আমি স্পিনার এবং বোতাম উভয়ই প্রদর্শন করছি যাতে তারা সত্যই অভিন্ন দেখায়। বোতামটি বাদ দিয়ে আপনি প্রাথমিক পাঠ্য যা চান তা সেট করতে পারেন।

ক্রিয়াকলাপটি কেমন দেখাচ্ছে তা এখানে:

package com.stevebergamini.spinnerbutton;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Spinner;

public class MainActivity extends Activity {

    Spinner spinner1;
    Button button1;
    AlertDialog ad;
    String[] countries;

    int selected = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner1 = (Spinner) findViewById(R.id.spinner1);
        button1 = (Button) findViewById(R.id.button1);

        countries = getResources().getStringArray(R.array.country_names);

        //  You can also use an adapter for the allert dialog if you'd like
        //  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, countries);        

        ad = new AlertDialog.Builder(MainActivity.this).setSingleChoiceItems(countries, selected,  
                new  DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            button1.setText(countries[which]);
                            selected = which;
                            ad.dismiss();

                        }}).setTitle(R.string.select_country).create(); 


        button1.setOnClickListener( new OnClickListener(){

            @Override
            public void onClick(View v) {
                ad.getListView().setSelection(selected);
                ad.show();              
            }});

    }

}

দ্রষ্টব্য: হ্যাঁ, আমি বুঝতে পারি যে এটি প্রয়োগকৃত থিমের উপর নির্ভরশীল এবং থিম.হোলো ব্যবহার করলে চেহারাটি কিছুটা আলাদা হবে। তবে, আপনি থিম.ব্ল্যাকের মতো কোনও উত্তরাধিকারী থিম ব্যবহার করছেন, তবে আপনি ভাল।


0

আপনার আইটেমগুলি ডেটাবেস-কার্সার থেকে পপুলেটে যখন আপনি এই সমস্যার মুখোমুখি হন ,

সবচেয়ে সহজ সমাধান যে আমি খুঁজে পাওয়া এই তাই উত্তর:

আপনার কার্সার অ্যাডাপ্টারের ক্যোয়ারিতে ইউনিয়নটি ব্যবহার করুন এবং ডিবিতে এটি যুক্ত না করেই আইডি = -1 সহ অতিরিক্ত আইটেম যুক্ত করুন:

কিছুটা এইরকম:

db.rawQuery ("iWorkerId _id হিসাবে নির্বাচন করুন, nvLastName নাম হিসাবে FROM কর্মী w ইউনিয়ন নির্বাচন করুন -1 _id হিসাবে, '' নাম হিসাবে", নাল);

যদি নির্বাচিত আইটেমটি -1 হয়, তবে এটি ডিফল্ট মান। অন্যথায় এটি টেবিল থেকে একটি রেকর্ড।


0

একটি ব্যানেল সলিউশন মনে হয় তবে আমি সাধারণত স্পিনারের সামনে একটি টেক্সটভিউ রাখি। পুরো এক্সএমএল দেখতে এটির মতো। (আরে ছেলেরা, আমাকে গুলি করো না, আমি জানি যে আপনারা কেউ কেউ এই ধরণের বিবাহ পছন্দ করেন না):

<FrameLayout
    android:id="@+id/selectTypesLinear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <Spinner
        android:id="@+id/spinnerExercises"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:entries="@array/exercise_spinner_entries"
        android:prompt="@string/exercise_spinner_prompt"
     />                         
    <TextView
        android:id="@+id/spinnerSelectText"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hey! Select this guy!"
        android:gravity="center"
        android:background="#FF000000" />


</FrameLayout>

তারপরে কোনও আইটেম নির্বাচন করা হলে আমি টেক্সটভিউটি আড়াল করি। স্পষ্টতই টেক্সটভিউয়ের পটভূমির রঙ স্পিনার হিসাবে একই হওয়া উচিত। অ্যান্ড্রয়েড ৪.০ এ কাজ করে। পুরানো সংস্করণে জানেন না।

হ্যাঁ. স্পিনার শুরুতে সেটঅনটাইমসলেক্টলিস্টনারকে কল করার কারণে পাঠ্যদর্শনটি লুকানো কিছুটা জটিল হতে পারে তবে এইভাবে করা যেতে পারে:

    Boolean controlTouched;

    exerciseSpinner.setOnTouchListener(new OnTouchListener() {


        @Override
        public boolean onTouch(View v, MotionEvent event) {
            controlTouched = true; // I touched it but but not yet selected an Item.
            return false;
        }

    });
    exerciseSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            if (controlTouched) { // Are you sure that I touched it with my fingers and not someone else  ?
                spinnerSelText.setVisibility(View.GONE);
            }
        }

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

    });

0

আমার জন্য এটি এমন কিছু কাজ করেছিল। উন্নতি হয়েছে যা কেবলমাত্র কিছু বিকল্পের পাঠ্যকে পরিবর্তন করে, সমস্ত ক্ষেত্রে নয়।

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

public void rellenarSpinnerCompeticiones(){
        spinnerArrayCompeticiones = new ArrayList<String>();
        for(Competicion c: ((Controlador)getApplication()).getCompeticiones()){
            spinnerArrayCompeticiones.add(c.getNombre());
        }
        //ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,R.layout.spinner_item_competicion,spinnerArrayCompeticiones);
        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, R.layout.spinner_item_competicion, spinnerArrayCompeticiones){
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                final View v = vi.inflate(R.layout.spinner_item_competicion, null);
                final TextView t = (TextView)v.findViewById(R.id.tvCompeticion);
                if(spinnerCompeticion.getSelectedItemPosition()>0){
                    t.setText(spinnerArrayCompeticiones.get(spinnerCompeticion.getSelectedItemPosition()));
                }else{
                    t.setText("Competiciones");
                }
                return v;
            }
        };
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerCompeticion.setAdapter(spinnerArrayAdapter);
    }

0

এখানে একটি সহজ

    private boolean isFirst = true;
private void setAdapter() {
    final ArrayList<String> spinnerArray = new ArrayList<String>();     
    spinnerArray.add("Select your option");
    spinnerArray.add("Option 1");
    spinnerArray.add("Option 2");
    spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            TextView tv = (TextView)selectedItemView;
            String res = tv.getText().toString().trim();
            if (res.equals("Option 1")) {
            //do Something
        } else if (res.equals("Option 2")) {
            //do Something else
        }
        }

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

    });

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_spinner_style,spinnerArray) {
         public View getView(int position, View convertView, ViewGroup parent) {
             View v = super.getView(position, convertView, parent);
             int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, getResources().getDisplayMetrics());                  
             ((TextView) v).setTypeface(tf2);
             ((TextView) v).getLayoutParams().height = height;
             ((TextView) v).setGravity(Gravity.CENTER);
             ((TextView) v).setTextSize(TypedValue.COMPLEX_UNIT_SP, 19);
             ((TextView) v).setTextColor(Color.WHITE);
             return v;
         }

         public View getDropDownView(int position, View convertView,
                 ViewGroup parent) {
             if (isFirst) {
                 isFirst = false;
                 spinnerArray.remove(0);
             }
             View v = super.getDropDownView(position, convertView, parent);                  
             ((TextView) v).setTextColor(Color.argb(255, 70, 70, 70));
             ((TextView) v).setTypeface(tf2);
             ((TextView) v).setGravity(Gravity.CENTER);
             return v;
         }
     };
     spin.setAdapter(adapter);
}

0

উপরের যে কোনও একটি উত্তর দেখুন: https://stackoverflow.com/a/23005376/1312796

আমি একটু বাগ ঠিক করার জন্য আমার কোড যুক্ত করেছি। যেখানে কোনও তথ্য পুনরুদ্ধার করা হয়নি..প্রম্পট পাঠ্যটি কীভাবে দেখানো হবে ..!

এই আমার কৌশলটি ... এটি আমার সাথে ভাল কাজ করে। !

আপনার স্পিনারকে কোনও রিলেটিভ_এলআউটআউটে রাখার চেষ্টা করুন এবং আপনার স্পিনারের সাথে একটি টেক্সটভিউ সারিবদ্ধ করুন এবং স্পিনারের অ্যাডাপ্টার লোড বা খালি থাকায় টেক্সটভিউয়ের (প্রদর্শন / লুকান) দৃশ্যমানতার সাথে খেলুন..এটি পছন্দ করুন:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:background="#ededed"
android:orientation="vertical">



    <TextView
        android:id="@+id/txt_prompt_from"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="@color/gray"
        android:textSize="16sp"
        android:layout_alignStart="@+id/sp_from"
        android:text="From"
        android:visibility="gone"/>

    <Spinner
        android:id="@+id/sp_from"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        />

কোডটি এখানে:

  txt__from = (TextView) rootView.findViewById(R.id.txt_prompt_from);

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

setPromptTextViewVisibility (); //True or fales 

public void setPromptTextViewVisibility (boolean visible )
{
    if (visible)
    {
        txt_from.setVisibility(View.VISIBLE);
    }
    else
    {
        txt_from.setVisibility(View.INVISIBLE);
    }

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