2012-03-13 4 views
12

Sto sviluppando un'applicazione Android per supportare sia l'En/Ar. Ma ho affrontato un problema che se l'utente cambia da En ad Ar l'allineamento dell'interfaccia utente deve passare da "sinistra a destra" a "destra a sinistra".Sviluppo di un'applicazione Android per supportare "allineamento layout" inglese e arabo

Esempio: (TextView) (EditText) questo è in En

Ma in Ar dovrebbe essere: (EditText) (TextView).

C'è un modo per fare questo senza creare due layout diversi o due versioni differenti?

+0

Non dimenticare di fare clic sul segno di spunta accanto alla soluzione che accetti come risposta alla tua domanda. –

risposta

12

Perché non è possibile farlo con due layout (non hai mai detto perché questo non è desiderabile)? Come descritto nella documentazione di Android Developers

Gran parte della localizzazione di un'applicazione fornisce il testo alternativo per lingue diverse. In alcuni casi, fornirai anche grafica alternativa, suoni, layout e altre risorse locali specifiche .

Un'applicazione può specificare molte res // directory, ciascuna con qualificatori diversi. Per creare una risorsa alternativa per una locale diversa , si utilizza un qualificatore che specifica una lingua o una combinazione di lingua-regione .

Rif: http://developer.android.com/guide/topics/resources/localization.html

Quindi nel tuo caso creare res/layout-ar quindi copiare il layout esistente in questa cartella e poi semplicemente scambiarli turno. Semplice, segue le migliori pratiche ed è facile da fare. Ciò rende inoltre possibili ulteriori modifiche alla localizzazione senza dover scrivere altro codice.

Se si dovesse scrivere codice, sarà necessario trovare la lingua predefinita del dispositivo e quindi scambiare le viste in base a ciò. È possibile ottenere la lingua:

Locale.getDefault().getDisplayLanguage(); 

Vedere questa domanda per maggiori dettagli: Get the current language in device

Su una nota personale finale: Penso che il primo è una migliore separazione degli interessi, come il codice prevede logica e i layout XML controllano effettivamente il layout (con Android che seleziona automaticamente le risorse giuste per te senza dover scrivere altro codice).

+0

+1 per diversi layout per locale. Inoltre, se sei preoccupato di provare a mantenere più versioni dello stesso layout, considera la possibilità di effettuare ricerche in Layout incluso: http://developer.android.com/resources/articles/layout-tricks-merge.html –

+0

@Jakobud parla perfettamente (un po 'irritato che me ne sia dimenticato) - ha giocato bene signore! –

+1

Mantenere un intero progetto di layout in duplicato è un incubo! Anche in una delle mie piccole app utilizzo 20-30 file di layout. Per ogni bug o aggiornamento funzionale che utilizza un layout duplicato raddoppia la quantità di lavoro che devo fare - questa potrebbe essere l'opzione migliore ma non è certamente una buona scelta. – Graeme

-3

Perché non basta rendere la TextView sopra EditText?

+0

Ove possibile, potrebbe essere necessario progettare il layout in modo che sia lasciato/lasciato indipendente per evitare di dover duplicare: sembra una risposta abbastanza ragionevole. – Graeme

0

Ho cercato di prendere un po 'l'orrore di questo con la creazione di un set di costume LabeledView componenti (per i componenti Form come CheckBox, EditText e Spinners). Queste viste (come LabledEditText) gonfiano un layout specifico della regione e implementano il minimo delle chiamate per poter agire come facciata (EditText in questo caso).

res/layout/component_labeled_view.xml - [TextView][EditText] 
res/layout-ar/component_labeled_view.xml - [EditText][TextView] 

La classe View stesso contiene:

public LabeledEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater inflator = LayoutInflater.from(context); 

    mContainer  = inflator.inflate(R.layout.component_labeled_edittext, null);  
    mValueView  = (EditText) mContainer.findViewById(R.id.editText); 
    mLabelTextView = (TextView) mContainer.findViewById(R.id.textView); 

    align(attrs); 
} 

public Editable getText() { 
    return ((EditText)mValueView).getText(); 
} 

public void setText(String text) { 
    ((EditText)mValueView).setText(text); 
} 

public void addTextChangedListener(TextWatcher watcher) { 
    ((EditText)mValueView).addTextChangedListener(watcher); 
} 

Questo dovrebbe almeno ridurre duplicazioni, come si dovrebbe ora essere in grado di fare riferimento la vista LabeledEditText piuttosto che un combo TextView e EditText.

Nella mia implementazione che non ho pienamente dimostrato che ho fatto un passo ulteriore e ha creato un abstract LabeledView classe che utilizza alcuni attributi personalizzati che mi permette di personalizzare sia l'etichetta e il valore in situazioni specifiche (vedere la linea di align(attrs); codice). A seconda di quanto è grande la tua app, potresti voler provare qualcosa di simile?

0

Android 4.2 ha introdotto il supporto nativo per il layout "da destra a sinistra". In AndroidManifest impostare android: supportsRtl = "true" a livello di applicazione e nelle proprietà di layout utilizzare le proprietà start/end invece di left/right. Ecco il video con spiegazione dettagliata: https://youtu.be/plW1qSGDSzs

Problemi correlati