2013-01-04 8 views
7

Guardando il codice sorgente per TypedArray (link), non riesco a capire quale sia la differenza tra questi due metodi. getInt() è praticamente lo stesso di getInteger(), ma con una piccola aggiunta alla fine che non capisco. Qualcuno può spiegarmelo?Qual è la differenza tra TypedArray.getInteger() e TypedArray.getInt()?

La ragione per cui ho bisogno di sapere la differenza è che sto implementando una sottoclasse Preference personalizzata, e per ottenere il valore predefinito ho bisogno di sovrascrivere onGetDefaultValue(), che acquisisce un numero intero da un TypedArray. Esempio:

@Override 
protected Object onGetDefaultValue(TypedArray a, int index) 
{ 
    return a.getInteger(index, DEFAULT_VALUE); 
} 

Qui sto usando getInteger(), ma se getInt() è meglio, quindi userò questo.

risposta

7

Hanno semplicemente casi "tutto il resto fallisce". Entrambi restituiscono uno int valido per int e defValue per null. La differenza è come gestiscono il caso di nessuno di questi.

Dal link:

/* 
* Copyright (C) 2008 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

TypedValue v = mValue; 
if (getValueAt(index, v)) { 
    Log.w(Resources.TAG, "Converting to int: " + v); 
    return XmlUtils.convertValueToInt(
     v.coerceToString(), defValue); 
} 
Log.w(Resources.TAG, "getInt of bad type: 0x" 
     + Integer.toHexString(type)); 
return defValue; 

Questo è l'extra a cui ti riferisci. Sembra che converta un valore sconosciuto in una stringa e poi in un intero. Questo potrebbe essere utile se disponi di "12" o di un valore equivalente memorizzato.

Inoltre getInteger genera un'eccezione se non è null e non è int. Al contrario, se tutto il resto fallisce, getInt restituisce il valore predefinito.

Si noti inoltre che il comportamento di questi in questo caso strano è abbastanza diverso da non essere corretto in tutti i casi. La soluzione migliore è quella che soddisfa le tue aspettative per il fallimento.

+0

Grazie. Quindi quale useresti per 'onGetDefaultValue()'? Penso che andrò con 'getInt()' perché "cerca un po 'più difficile" e restituirà almeno qualcosa. –

+1

Hmmm, ho appena testato entrambi con input non-non non nullo (specificato una stringa senza senso per l'attributo 'android: defaultValue' XML) e sembra che entrambi generino eccezioni se viene rilevato un valore sconosciuto ('getInt()' genera un'eccezione se la riga XMLUtils non riesce). Quindi non penso che importi davvero ciò che è usato in 'onGetDefaultValue()' ... –

Problemi correlati