24

Sto creando un programma e all'interno del quale ho bisogno di creare un elenco di tutti i diversi componenti di Android, ma piuttosto che capire e digitare manualmente l'elenco . Mi piacerebbe capire a livello programmatico se potrei realizzare questo per essere aggiunto a String Array come il seguente?Come posso creare dinamicamente un elenco di tutti i componenti ui di Android a livello di programmazione? per esempio. TextView, ImageView, ecc

Components[] = {"TextView", "ImageView", "RelativeLayout", "LinearLayout", "Random", "DecimalFormat ... 

Allo stesso modo vorrei creare programatically un elencodi tutti i diversi tipi di dati per esempio Int, String, ArrayList ecc da aggiungere a matrici di stringhe come il seguito

DataTypes[] = {"Int", "String", "Object", "Double", "Char", "Boolean ... 

Quello che ho potuto fare finora, è al di sopra. Finora li ho digitati fisicamente come sopra.

Come posso realizzare questo? Grazie

Chiarimento

Con i tipi di dati: intendo tipi variabili dichiarate ai contiene i dati per esempio Int, String, Object, booleano, doppie, array, ecc ArrayLists

da componenti: Voglio dire qualsiasi componente visuale che può essere aggiunto ad un xml di Android ad es. ImageView, TextView, LinearLayout, RelativeLayout ecc

Sì, so il numero di questi componenti può essere infinita (determinato dalle API in uso), per cui desidero generare dinamicamente

Preferibilmente colpo usando la libreria di qualcun altro

+0

Volete un elenco di tutte queste componenti che esistono in tutti i Android, o solo i componenti ei tipi di dati utilizzati nella vostra applicazione? –

+0

A livello di codice, tutti esistenti in Android –

+0

Vuoi creare un elenco di componenti dell'interfaccia utente senza utilizzare ListView ?? –

risposta

1

Si possono elencare i componenti dell'interfaccia utente tutte le classi nel pacchetto android.view o le android.view.View sottoclassi utilizzando The Reflection Library:

Reflections reflections = new Reflections("android.view"); 
//Reflections reflections = new Reflections("android.view.View"); 

Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class); 

Per creare un elenco di tutti i tipi di dati si potrebbe fare lo stesso sopra usando la classe Object, ma prima, mi chiederei personalmente a che cosa serve fare questo.

1

Reflections è una libreria fantastica per Java. Non sono sicuro che funzioni anche su Android. Qualcuno opened an issue, è stato chiuso poco dopo senza alcuna spiegazione.

Se è possibile farlo funzionare in Android, è possibile utilizzare questo codice per ottenere tutte le componenti:

Reflections reflections = new Reflection("android.widget") //specifiy the package (TextView etc. are in here) 
Set<Class<? extends View>> components = reflections.getSubTypesOf(View.class); 

Se si desidera, è possibile ripetere questa procedura con il pacchetto android.view, dove alcune altre classi come come ViewGroup si trovano.

Inoltre, se si vuole veramente un array di stringhe, ottenere i nomi delle classi:

List<String> componentNames = new ArrayList<String>(); 
for (Class<? extends View> c: components) { 
    componentNames.add(c.getName()); 
} 
String[] allComponents = componentNames.toArray(); 


Se la soluzione di cui sopra non funziona per voi, provare a ottenere le classi dal sito ufficiale.Le classi sono elencate nei pacchetti android.view e android.widget. Basta copiare i nomi rilevanti e incollarli nel codice sorgente. Questo non sarebbe dinamico, ma funziona.

9

Non è necessario utilizzare tutte le librerie di terze parti, dal momento che ha Javareflections. Questo metodo farà di tutto per voi e rendere il UI senza problemi:

for(String s : arrayWithNames){ 
    View view = createViewInstance(0, s); 
    if(view instance of View){ 
     //handle if it is view 
    }else{ 
     //this is viewgroup 
    } 
} 

E createViewInstance():

private View createViewInstance(String name){ 
    View view = null; 
    try{ 
     if(name.equalsIgnoreCase("View"){ // if it is view 
      Class viewClass = Class.forName("android.view." + name); 
      view = (View) viewClass.getConstructor(Context.class).newInstance(new Object[]{ctx}); 
     }else{ // if it is widget: ImageView, RelativeLayout etc 
      Class viewClass = Class.forName("android.widget." + name); 
      view = (View) viewClass.getConstructor(Context.class).newInstance(new Object[]{ctx}); 
     } 
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException 
      | InstantiationException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return view; 
} 

Questo è tutto. Hai tutto per gestire qualsiasi tipo di View. Ho testato il codice sopra e utilizzato nel progetto. Funziona bene. Esattamente la stessa situazione con altri Object s. Non è possibile creare int con la riflessione, ma è possibile creare Integer, quindi ciò che fondamentalmente è lo stesso.

Un problema con esso ci sono molti più tipi di solo View e ViewGroup. Ma dipende anche da quanti tipi di Object si desidera creare ... Nell'esempio dato diciamo che farò char, String, int, Object e quindi lo si può facilmente estendere.

Poiché tutti questi tipi di dati sono nello stesso pacchetto, per noi è molto più semplice. Metodo createVarInstance():

private Object createVarInstance(String name){ 
    Object obj = null; 
    try{ 
     Class varClass = Class.forName("java.lang." + name); 
     object = (Object) varClass.newInstance(); 
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException 
      | InstantiationException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return object; 
} 

Se sarà essere desiderato è possibile effettuare un metodo per diversi pacchetti. Se in futuro si desidera creare più e diversi tipi di variabili, che sono in pacchetti diversi, quindi sarà necessario controllare i nomi o fare operazioni simili come in esempio con View s.

0

come circa l'uso di una fabbrica per creare il componente in questo modo:

public class ComponentFactory { 
    private HashMap<String, View> mMap; 
    public ComponentFactory(Context context) { 
     mMap = new HashMap<String, View>(); 
     mMap.put("TextView", new TextView(context)); 
     ... 
     ... 
    } 

    public View getComponent(String name) { 
     View v = mMap.get(name); 
     if (v == null) { 
      throw new IlllegalArgumentException(); 
     } 
     return v; 
    } 
} 
Problemi correlati