2015-08-28 12 views
16

So che è possibile fare riferimento a risorse a disposizione per la loro ID di risorsa:DataBinding: come ottenere la risorsa dall'id dinamico?

android:text="@{@string/resourceName}" 

Tuttavia, vorrei fare riferimento risorsa da id che è noto solo in fase di esecuzione. Come semplice esempio, immaginare che abbiamo tale modello:

public class MyPOJO { 

    public final int resourceId = R.string.helloWorld; 

} 

E ora ho bisogno di usare questo valore come un valore in una stringa di formato. Chiamiamolo

<string name"myFormatString">Value is: %s</string> 

L'approccio più diretto non funziona:

android:text="@{@string/myFormatString(myPojo.resourceId)} 

Questo valore intero sarà solo mettere in segnaposto (anche prova che ho inizializzato correttamente il mio POJO, quindi non sto fornendo intero layout qui).

Ho anche provato a utilizzare @BindingConversion, ma non ha funzionato (che è effettivamente previsto, ma ho provato comunque) - int è stato ancora assegnato al segnaposto e il metodo di collegamento non è stato chiamato.

Come posso ottenere esplicitamente una risorsa dal suo id nella libreria DataBinding?

risposta

7

ho finito per creare il mio metodo:

public class BindingUtils { 

    public static String string(int resourceId) { 
     return MyApplication 
       .getApplication() 
       .getResources() 
       .getString(resourceId); 
    } 

} 

Dichiarare un'importazione per esso:

<data> 

    <import type="com.example.BindingUtils" /> 

    ... 

</data> 

E proprio definendolo durante vincolante:

android:text="@{@string/myFormatString(BindingUtils.string(myPojo.resourceId))}" 

sarebbe bello avere un metodo pronto per questo. DataBinding è sitll in Beta - quindi forse arriverà in futuro.

11

Un'altra soluzione è creare un @BindingAdapter personalizzato per esso.

@BindingAdapter({"format", "argId"}) 
public static void setFormattedText(TextView textView, String format, int argId){ 
    if(argId == 0) return; 
    textView.setText(String.format(format, textView.getResources().getString(argId))); 
} 

E quindi fornire solo le variabili separatamente.

<TextView 
    app:format="@{@string/myFormatString}" 
    app:argId="@{myPojo.resourceId}" 

È possibile utilizzare un array se sono necessari più argomenti, ma nel mio caso uno era sufficiente.

9

A partire dal giugno 2016 questo è possibile in XML:

android:text= "@{String.format(@string/my_format_string, myPojo.resourceId)}" 
+0

non ho modo di provare in questo momento, quindi solo per confermare - sarà inserire il stringa per dato resourceId o id stesso come 'int'? –

+0

Restituisce il resourceId – Robust

0

È possibile utilizzare:

android:text='@{(id > 0) ? context.getString(id) : ""}'