سؤال

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

<Spinner
    android:id="@+id/searchCriteria"
    android:entries="@array/searchBy"
    android:entryValues="@array/searchByValues" />

أتوقع spinner.getSelectedItem() لإعادة صفيف [title, value]ولكن في الواقع يعيد مجرد سلسلة العنوان. هل يتجاهلandroid:entryValues؟ كيف أحصل على قيمة ، وليس عنوانًا منه؟ هل هذا قابل للتنفيذ مع XML فقط أم أنني بحاجة إلى إنشاء محول والقيام به برمجيًا؟

هل كانت مفيدة؟

المحلول

بدلاً من طريقة الصفيف المزدوج ، لماذا لا تملأ ArrayAdapter برمجيًا مع كائنات من نوع معروف واستخدامها. لقد كتبت برنامجًا تعليميًا لطبيعة مماثلة (رابط في الأسفل) يقوم بذلك. الفرضية الأساسية هي إنشاء مجموعة من كائنات Java ، وإخبار الدوار عن ، ثم استخدام تلك الكائنات مباشرة من فئة Spinner. في مثال ، لدي كائن يمثل "حالة" يتم تعريفه على النحو التالي:

package com.katr.spinnerdemo;

public class State {

// Okay, full acknowledgment that public members are not a good idea, however
// this is a Spinner demo not an exercise in java best practices.
public int id = 0;
public String name = "";
public String abbrev = "";

// A simple constructor for populating our member variables for this tutorial.
public State( int _id, String _name, String _abbrev )
{
    id = _id;
    name = _name;
    abbrev = _abbrev;
}

// The toString method is extremely important to making this class work with a Spinner
// (or ListView) object because this is the method called when it is trying to represent
// this object within the control.  If you do not have a toString() method, you WILL
// get an exception.
public String toString()
{
    return( name + " (" + abbrev + ")" );
}
}

ثم يمكنك ملء الدوار مع مجموعة من هذه الفئات على النحو التالي:

       // Step 1: Locate our spinner control and save it to the class for convenience
    //         You could get it every time, I'm just being lazy...   :-)
    spinner = (Spinner)this.findViewById(R.id.Spinner01);

    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,
          android.R.layout.simple_spinner_item, new State[] {   
                new State( 1, "Minnesota", "MN" ), 
                new State( 99, "Wisconsin", "WI" ), 
                new State( 53, "Utah", "UT" ), 
                new State( 153, "Texas", "TX" ) 
                });

    // Step 3: Tell the spinner about our adapter
    spinner.setAdapter(spinnerArrayAdapter);  

يمكنك استرداد العنصر المحدد على النحو التالي:

State st = (State)spinner.getSelectedItem();

والآن لديك فئة Java حسنة النية للعمل معها. إذا كنت ترغب في الاعتراض عند تغيير قيمة الدوار ، فما عليك سوى تنفيذ onItEmsextedListener وإضافة الطرق المناسبة للتعامل مع الأحداث.

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
    // Get the currently selected State object from the spinner
    State st = (State)spinner.getSelectedItem();

    // Now do something with it.
} 

public void onNothingSelected(AdapterView<?> parent ) 
{ 
}

يمكنك العثور على البرنامج التعليمي بأكمله هنا:http://www.katr.com/article_android_spinner01.php

نصائح أخرى

لذلك إذا أتيت إلى هنا لأنك تريد أن يكون لديك كل من التسمية والقيمة في الدوار - إليك كيف فعلت ذلك:

  1. فقط قم بإنشاء الدوار الخاص بك بالطريقة المعتادة
  2. حدد 2 صفيفات متساوية في ملف Array.xml. واحد للتسميات ، واحد للقيم
  3. اضبط الدوار الخاص بك مع android:entries="@array/labels"
  4. في الكود الخاص بك - عندما تحتاج إلى قيمة افعل شيئًا كهذا (لا ، لا تضطر لارتباطه)

    String selectedVal = getResources().getStringArray(R.array.values)[spinner
                             .getSelectedItemPosition()];
    

  5. وتذكر - يجب أن تتطابق هاتان المصفوفتان مع بعضهما البعض بقدر فتحات الأرقام والمواقف

إحباط ، إجهاض! لا أعرف ما الذي دخل إلي ولكن Spinner لا يدعم android:entryValues ينسب. هذا هو في الواقع من ListPreference وهو ما يفعل شيئًا مشابهًا (يعرض قائمة العناصر في الحوار المنبثق). لما أحتاجه ، سأضطر إلى استخدام (للأسف) SpinnerAdapter

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