วิธีการตั้งค่ารายการที่เลือกของสปินเนอร์ตามค่าไม่ใช่ตำแหน่ง?


297

ฉันมีมุมมองอัปเดตที่ฉันต้องเลือกค่าที่เก็บไว้ในฐานข้อมูลสำหรับสปินเนอร์ล่วงหน้า

ฉันกำลังนึกอะไรบางอย่างเช่นนี้อยู่ แต่Adapterไม่มีindexOfวิธีดังนั้นฉันจึงติดอยู่

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}

คำตอบ:


646

สมมติว่าSpinnerชื่อของคุณmSpinnerและมีเป็นหนึ่งในตัวเลือก: "ค่าบางอย่าง"

ในการค้นหาและเปรียบเทียบตำแหน่งของ "ค่าบางอย่าง" ในสปินเนอร์ใช้สิ่งนี้:

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}

5
ด้วยอะแดปเตอร์ที่กำหนดเองคุณจะต้องเขียน (แทนที่) รหัสสำหรับ getPosition ()
Soham

3
ถ้าคุณไม่ได้ตรวจสอบกับสตริง แต่องค์ประกอบภายในวัตถุและเป็นไปไม่ได้ที่จะใช้ toString () ทำให้ค่าของสปินเนอร์แตกต่างจากเอาต์พุตของ toString ()
Ajibola

1
ฉันรู้ว่านี่เก่ามาก แต่ตอนนี้มีการโทรไปยังตำแหน่งที่ไม่ จำกัด (T)
Brad Bass

มีข้อผิดพลาดที่คล้ายกันเกิดขึ้น แต่การใช้วิธีเรียนแบบเก่าช่วย: stackoverflow.com/questions/25632549/…
Manny265

อืม ... ตอนนี้ถ้าฉันดึงค่าจาก, พูด, Parse.com และต้องการสอบถามผู้ใช้เพื่อให้การเลือกสปินเนอร์เริ่มต้นเป็นค่าเริ่มต้นเป็นค่าฐานข้อมูลของผู้ใช้
drearypanoramic

141

วิธีง่ายๆในการตั้งเครื่องปั่นด้ายตามค่าคือ

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 

วิธีที่จะรหัสซับซ้อนมีอยู่แล้วนี่เป็นเพียงที่ชัดเจนมาก


7
คุณลืมที่จะเพิ่มbreak;เมื่อพบดัชนีเพื่อเร่งกระบวนการ
spacebiker

ทำไมไม่ใช้ทำ {} ในขณะที่ () เพื่อหลีกเลี่ยงการใช้ตัวแบ่ง
Catluc

@Catluc มี n หลายวิธีที่จะประสบความสำเร็จในการแก้ปัญหา ... คุณเลือกสิ่งที่ดีที่สุดสำหรับคุณ
Akhil เชน

4
มากกว่า0คุณควรกลับ-1ถ้าค่าไม่พบ - ตามที่ปรากฏในคำตอบของฉัน: stackoverflow.com/a/32377917/1617737 :-)
ห้าม-geoengineering

2
@ ban-geoengineering ฉันเขียน0เป็นภาพจำลองการสำรองข้อมูล หากคุณตั้งค่า-1รายการใดบ้างที่จะปรากฏที่สปินเนอร์ฉันคิดว่าองค์ประกอบที่ 0 ของอะแดปเตอร์สปินเนอร์การเพิ่ม -1 ยังเพิ่มการตรวจสอบน้ำหนักเกินว่าค่าเป็น -1 หรือไม่การตั้งค่า -1 จะทำให้เกิดข้อยกเว้น
Akhil Jain

34

ฉันเก็บ ArrayList แยกจากรายการทั้งหมดใน Spinners ของฉัน วิธีนี้ฉันสามารถทำ indexOf ใน ArrayList แล้วใช้ค่านั้นเพื่อตั้งค่าการเลือกใน Spinner


ไม่มีทางอื่นคุณรู้หรือไม่?
Pentium10

1
วิธีการตั้งค่าการเลือกเพื่ออะไร (หากรายการไม่ได้อยู่ในรายการ)
Pentium10

5
HashMap.get จะให้ความเร็วการค้นหาดีกว่า ArrayList.indexOf
Dandre Allison

29

จากคำตอบของเมอร์ริลล์ฉันคิดวิธีแก้ปัญหาบรรทัดเดียวนี้ ... มันไม่สวยมาก แต่คุณสามารถตำหนิใครก็ตามที่รักษารหัสไว้Spinnerสำหรับการละเลยที่จะรวมฟังก์ชั่นที่ทำสิ่งนี้

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

คุณจะได้รับคำเตือนเกี่ยวกับวิธีที่ArrayAdapter<String>ไม่เลือกตัวเลือกการส่งไปยัง... จริงๆคุณสามารถใช้แบบArrayAdapterที่ Merrill ทำได้ แต่เพียงแลกเปลี่ยนคำเตือนอีกข้อหนึ่ง


หากต้องการกำจัดคำเตือนที่ไม่ถูกตรวจสอบคุณควรใช้ <? > ในบล็อกของคุณแทน <String> ในความเป็นจริงเมื่อใดก็ตามที่คุณแสดงอะไรก็ตามที่มีประเภท >
xbakesx

ไม่ถ้าฉันส่งไปยัง <? > มันทำให้ฉันมีข้อผิดพลาดแทนคำเตือน: "วิธีการ getPosition (?) ในประเภท ArrayAdapter <?> ใช้ไม่ได้สำหรับอาร์กิวเมนต์ (String)"
ArtOfWarfare

ถูกต้องจากนั้นจะคิดว่าเป็น ArrayAdapter ที่ไม่มีประเภทดังนั้นจะไม่ถือว่า ArrayAdapter เป็น <String> ดังนั้นเพื่อหลีกเลี่ยงคำเตือนคุณจะต้องส่งมันไปที่ ArrayAdapter <? > จากนั้นส่งผลลัพธ์ของ adapter.get () ไปที่ String
xbakesx

@Dadani - ฉันคิดว่าคุณไม่เคยใช้ Python มาก่อนเพราะนี่มันซับซ้อนอย่างน่าประหลาด
ArtOfWarfare

ตกลงฉันไม่ได้เล่นกับ Python @ArtOfWarfare แต่นี่เป็นวิธีที่รวดเร็วสำหรับงานบางอย่าง
Daniel Dut

13

หากคุณใช้อาร์เรย์สตริงนี่เป็นวิธีที่ดีที่สุด:

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);

10

คุณสามารถใช้สิ่งนี้ได้เช่นกัน

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));

การทำงานที่ยอดเยี่ยม!
Sadman Hasan

8

หากคุณจำเป็นต้องมีเมธอด indexOf ในอะแดปเตอร์เก่า (และคุณไม่ทราบว่าการใช้งานพื้นฐาน) คุณสามารถใช้สิ่งนี้

private int indexOf(final Adapter adapter, Object value)
{
    for (int index = 0, count = adapter.getCount(); index < count; ++index)
    {
        if (adapter.getItem(index).equals(value))
        {
            return index;
        }
    }
    return -1;
}

7

จากคำตอบของเมอร์ริลล์นี่คือวิธีการทำ CursorAdapter

CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }


3

ฉันใช้อะแดปเตอร์ที่กำหนดเองเพราะรหัสนี้เพียงพอ:

yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));

ดังนั้นข้อมูลโค้ดของคุณจะเป็นดังนี้:

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }

3

นี่เป็นวิธีง่ายๆในการรับดัชนีโดยสตริง

private int getIndexByString(Spinner spinner, String string) {
    int index = 0;

    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) {
            index = i;
            break;
        }
    }
    return index;
}

3

คุณสามารถใช้วิธีนี้ทำให้รหัสของคุณง่ายและชัดเจนยิ่งขึ้น

ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);

หวังว่ามันจะช่วย


2

นี่คือทางออกของฉัน

List<Country> list = CountryBO.GetCountries(0);
CountriesAdapter dataAdapter = new CountriesAdapter(this,list);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spnCountries.setAdapter(dataAdapter);
spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId()));

และ getItemIndexById ด้านล่าง

public int getItemIndexById(String id) {
    for (Country item : this.items) {
        if(item.GetId().toString().equals(id.toString())){
            return this.items.indexOf(item);
        }
    }
    return 0;
}

หวังว่าจะช่วยได้!


2

นี่คือวิธีที่จะทำถ้าคุณใช้SimpleCursorAdapter(ซึ่งcolumnNameเป็นชื่อของคอลัมน์ db ที่คุณใช้ในการเติมข้อมูลของคุณspinner):

private int getIndex(Spinner spinner, String columnName, String searchString) {

    //Log.d(LOG_TAG, "getIndex(" + searchString + ")");

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found
    }
    else {

        Cursor cursor = (Cursor)spinner.getItemAtPosition(0);

        int initialCursorPos = cursor.getPosition(); //  Remember for later

        int index = -1; // Not found
        for (int i = 0; i < spinner.getCount(); i++) {

            cursor.moveToPosition(i);
            String itemText = cursor.getString(cursor.getColumnIndex(columnName));

            if (itemText.equals(searchString)) {
                index = i; // Found!
                break;
            }
        }

        cursor.moveToPosition(initialCursorPos); // Leave cursor as we found it.

        return index;
    }
}

นอกจากนี้ (การปรับแต่งคำตอบของ Akhil ) นี่เป็นวิธีที่สอดคล้องกันในการทำหากคุณกำลังเติมสปินเนอร์ของคุณจากอาร์เรย์:

private int getIndex(Spinner spinner, String searchString) {

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found

    }
    else {

        for (int i = 0; i < spinner.getCount(); i++) {
            if (spinner.getItemAtPosition(i).toString().equals(searchString)) {
                return i; // Found!
            }
        }

        return -1; // Not found
    }
};

1

หากคุณตั้งค่าอาร์เรย์ XML เป็นสปินเนอร์ในเค้าโครง XML คุณสามารถทำได้

final Spinner hr = v.findViewById(R.id.chr);
final String[] hrs = getResources().getStringArray(R.array.hours);
if(myvalue!=null){
   for (int x = 0;x< hrs.length;x++){
      if(myvalue.equals(hrs[x])){
         hr.setSelection(x);
      }
   }
}

0

จริงๆแล้วมีวิธีในการรับสิ่งนี้โดยใช้การค้นหาดัชนีใน AdapterArray และทั้งหมดนี้สามารถทำได้ด้วยการสะท้อนกลับ ฉันยังก้าวต่อไปอีกขั้นหนึ่งเนื่องจากฉันมี 10 สปินเนอร์สและต้องการตั้งค่าแบบไดนามิกจากฐานข้อมูลของฉันและฐานข้อมูลเก็บค่าไม่เฉพาะข้อความเนื่องจากสปินเนอร์เปลี่ยนจริงทุกสัปดาห์ดังนั้นค่าคือหมายเลขรหัสของฉันจากฐานข้อมูล

 // Get the JSON object from db that was saved, 10 spinner values already selected by user
 JSONObject json = new JSONObject(string);
 JSONArray jsonArray = json.getJSONArray("answer");

 // get the current class that Spinner is called in 
 Class<? extends MyActivity> cls = this.getClass();

 // loop through all 10 spinners and set the values with reflection             
 for (int j=1; j< 11; j++) {
      JSONObject obj = jsonArray.getJSONObject(j-1);
      String movieid = obj.getString("id");

      // spinners variable names are s1,s2,s3...
      Field field = cls.getDeclaredField("s"+ j);

      // find the actual position of value in the list     
      int datapos = indexedExactSearch(Arrays.asList(Arrays.asList(this.data).toArray()), "value", movieid) ;
      // find the position in the array adapter
      int pos = this.adapter.getPosition(this.data[datapos]);

      // the position in the array adapter
      ((Spinner)field.get(this)).setSelection(pos);

}

นี่คือการค้นหาที่จัดทำดัชนีซึ่งคุณสามารถใช้กับเกือบทุกรายการตราบเท่าที่ฟิลด์นั้นอยู่ในระดับบนสุดของวัตถุ

    /**
 * Searches for exact match of the specified class field (key) value within the specified list.
 * This uses a sequential search through each object in the list until a match is found or end
 * of the list reached.  It may be necessary to convert a list of specific objects into generics,
 * ie: LinkedList&ltDevice&gt needs to be passed as a List&ltObject&gt or Object[&nbsp] by using 
 * Arrays.asList(device.toArray(&nbsp)).
 * 
 * @param list - list of objects to search through
 * @param key - the class field containing the value
 * @param value - the value to search for
 * @return index of the list object with an exact match (-1 if not found)
 */
public static <T> int indexedExactSearch(List<Object> list, String key, String value) {
    int low = 0;
    int high = list.size()-1;
    int index = low;
    String val = "";

    while (index <= high) {
        try {
            //Field[] c = list.get(index).getClass().getDeclaredFields();
            val = cast(list.get(index).getClass().getDeclaredField(key).get(list.get(index)) , "NONE");
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        if (val.equalsIgnoreCase(value))
            return index; // key found

        index = index + 1;
    }

    return -(low + 1);  // key not found return -1
}

วิธีการร่ายซึ่งสามารถสร้างได้สำหรับ primitives ทั้งหมดที่นี่คือหนึ่งสำหรับ string และ int

        /**
 *  Base String cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type String
 */
public static String cast(Object object, String defaultValue) {
    return (object!=null) ? object.toString() : defaultValue;
}


    /**
 *  Base integer cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type integer
 */
public static int cast(Object object, int defaultValue) { 
    return castImpl(object, defaultValue).intValue();
}

    /**
 *  Base cast, return either the value or the default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type Object
 */
public static Object castImpl(Object object, Object defaultValue) {
    return object!=null ? object : defaultValue;
}

0

ในการทำให้แอปพลิเคชันจดจำค่าสปินเนอร์ที่เลือกล่าสุดคุณสามารถใช้รหัสด้านล่าง:

  1. โค้ดด้านล่างจะอ่านค่าสปินเนอร์และกำหนดตำแหน่งสปินเนอร์ตามลำดับ

    public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    int spinnerPosition;
    
    Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.ccy_array,
            android.R.layout.simple_spinner_dropdown_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_list_item_activated_1);
    // Apply the adapter to the spinner
    spinner1.setAdapter(adapter1);
    // changes to remember last spinner position
    spinnerPosition = 0;
    String strpos1 = prfs.getString("SPINNER1_VALUE", "");
    if (strpos1 != null || !strpos1.equals(null) || !strpos1.equals("")) {
        strpos1 = prfs.getString("SPINNER1_VALUE", "");
        spinnerPosition = adapter1.getPosition(strpos1);
        spinner1.setSelection(spinnerPosition);
        spinnerPosition = 0;
    }
  2. และวางโค้ดด้านล่างที่คุณรู้ว่ามีค่าสปินเนอร์ล่าสุดหรือที่อื่นตามที่ต้องการ โค้ดนี้ส่วนใหญ่เขียนค่าสปินเนอร์ใน SharedPreferences

        Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
        String spinlong1 = spinner1.getSelectedItem().toString();
        SharedPreferences prfs = getSharedPreferences("WHATEVER",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prfs.edit();
        editor.putString("SPINNER1_VALUE", spinlong1);
        editor.commit();

0

ฉันมีปัญหาเดียวกันเมื่อพยายามเลือกรายการที่ถูกต้องในสปินเนอร์ที่มีประชากรโดยใช้ cursorLoader ฉันดึง ID ของรายการที่ฉันต้องการเลือกก่อนจากตารางที่ 1 จากนั้นใช้ CursorLoader เพื่อเติมสปินเนอร์ ใน onLoadFinished ฉันขี่จักรยานผ่านเคอร์เซอร์เพื่อเติมอะแดปเตอร์ของเครื่องปั่นด้ายจนกว่าฉันจะพบรายการที่ตรงกับ id ที่ฉันมีอยู่แล้ว จากนั้นกำหนดหมายเลขแถวของเคอร์เซอร์ไปยังตำแหน่งที่เลือกของสปินเนอร์ มันจะเป็นการดีถ้ามีฟังก์ชั่นที่คล้ายกันเพื่อส่งผ่าน ID ของค่าที่คุณต้องการเลือกในสปินเนอร์เมื่อเติมรายละเอียดในฟอร์มที่มีผลลัพธ์สปินเนอร์ที่บันทึกไว้

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
  adapter.swapCursor(cursor);

  cursor.moveToFirst();

 int row_count = 0;

 int spinner_row = 0;

  while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the 
                                                             // ID is found 

    int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID));

    if (knownID==cursorItemID){
    spinner_row  = row_count;  //set the spinner row value to the same value as the cursor row 

    }
cursor.moveToNext();

row_count++;

  }

}

spinner.setSelection(spinner_row ); //set the selected item in the spinner

}

0

เนื่องจากคำตอบก่อนหน้าบางคำตอบถูกต้องมากฉันแค่ต้องการให้แน่ใจว่าไม่มีใครตกอยู่ในปัญหานี้

หากคุณตั้งค่าเพื่อArrayListใช้คุณต้องได้รับตำแหน่งของค่าใช้โครงสร้างสตริงเดียวกันString.formatString.format

ตัวอย่าง:

ArrayList<String> myList = new ArrayList<>();
myList.add(String.format(Locale.getDefault() ,"%d", 30));
myList.add(String.format(Locale.getDefault(), "%d", 50));
myList.add(String.format(Locale.getDefault(), "%d", 70));
myList.add(String.format(Locale.getDefault(), "%d", 100));

คุณต้องได้ตำแหน่งที่ต้องการเช่นนี้:

myList.setSelection(myAdapter.getPosition(String.format(Locale.getDefault(), "%d", 70)));

มิฉะนั้นคุณจะได้รับ-1รายการไม่พบ!

ผมใช้Locale.getDefault()เพราะภาษาอาหรับ

ฉันหวังว่าจะเป็นประโยชน์สำหรับคุณ


0

นี่คือทางออกที่สมบูรณ์ของฉันหวังว่า ฉันมีดังต่อไปนี้ Enum:

public enum HTTPMethod {GET, HEAD}

ใช้ในคลาสต่อไปนี้

public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...

รหัสเพื่อตั้งสปินเนอร์โดย HTTPMethod enum-member:

    Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod);
    ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, android.R.layout.simple_spinner_item, HTTPMethod.values());
    mySpinner.setAdapter(adapter);
    int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod);
    mySpinner.setSelection(selectionPosition);

ตำแหน่งที่R.id.spinnerHttpmethodถูกกำหนดในไฟล์เลย์เอาต์และandroid.R.layout.simple_spinner_itemจัดส่งโดย android-studio


0
YourAdapter yourAdapter =
            new YourAdapter (getActivity(),
                    R.layout.list_view_item,arrData);

    yourAdapter .setDropDownViewResource(R.layout.list_view_item);
    mySpinner.setAdapter(yourAdapter );


    String strCompare = "Indonesia";

    for (int i = 0; i < arrData.length ; i++){
        if(arrData[i].getCode().equalsIgnoreCase(strCompare)){
                int spinnerPosition = yourAdapter.getPosition(arrData[i]);
                mySpinner.setSelection(spinnerPosition);
        }
    }

ยินดีต้อนรับสู่ StackOverflow คำตอบที่มีรหัสเฉพาะในพวกเขามักจะถูกตั้งค่าสถานะเพื่อลบเนื่องจากเป็น "คุณภาพต่ำ" โปรดอ่านหัวข้อความช่วยเหลือเกี่ยวกับการตอบคำถามจากนั้นพิจารณาเพิ่มความเห็นในคำตอบของคุณ
เกรแฮม

@ user2063903 โปรดเพิ่มคำอธิบายในคำตอบของคุณ
LuFFy

0

ง่ายมากเพียงแค่ใช้ getSelectedItem();

เช่น :

ArrayAdapter<CharSequence> type=ArrayAdapter.createFromResource(this,R.array.admin_typee,android.R.layout.simple_spinner_dropdown_item);
        type.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mainType.setAdapter(type);

String group=mainType.getSelectedItem().toString();

วิธีการดังกล่าวส่งกลับค่าสตริง

ในข้างต้นR.array.admin_typeเป็นไฟล์ทรัพยากรสตริงในค่า

เพียงแค่สร้างไฟล์. xml ในสตริง >> ค่า


0

สมมติว่าคุณต้องเติมสปินเนอร์จากสตริงอาเรย์จากทรัพยากรและคุณต้องการเก็บค่าที่เลือกไว้จากเซิร์ฟเวอร์ ดังนั้นนี่เป็นวิธีหนึ่งในการตั้งค่าที่เลือกจากเซิร์ฟเวอร์ในสปินเนอร์

pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))

หวังว่ามันจะช่วย! ป.ล. รหัสอยู่ใน Kotlin!


0

เนื่องจากฉันต้องการบางสิ่งบางอย่างที่ใช้งานได้กับLocalizationฉันจึงได้วิธีการสองอย่างนี้:

    private int getArrayPositionForValue(final int arrayResId, final String value) {
        final Resources english = Utils.getLocalizedResources(this, new Locale("en"));
        final List<String> arrayValues = Arrays.asList(english.getStringArray(arrayResId));

        for (int position = 0; position < arrayValues.size(); position++) {
            if (arrayValues.get(position).equalsIgnoreCase(value)) {
                return position;
            }
        }
        Log.w(TAG, "getArrayPosition() --> return 0 (fallback); No index found for value = " + value);
        return 0;
    }

อย่างที่คุณเห็นฉันยังพบความซับซ้อนของความไวตัวพิมพ์เล็กและใหญ่ระหว่าง arrays.xml และvalueI เปรียบเทียบกับ หากคุณไม่มีสิ่งนี้วิธีการด้านบนสามารถทำให้ง่ายขึ้นเช่น:

return arrayValues.indexOf(value);

วิธีการช่วยเหลือแบบคงที่

public static Resources getLocalizedResources(Context context, Locale desiredLocale) {
        Configuration conf = context.getResources().getConfiguration();
        conf = new Configuration(conf);
        conf.setLocale(desiredLocale);
        Context localizedContext = context.createConfigurationContext(conf);
        return localizedContext.getResources();
    }

-3

คุณต้องผ่านอะแดปเตอร์ที่กำหนดเองของคุณด้วยตำแหน่งเช่น REPEAT [ตำแหน่ง] และมันทำงานอย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.