Come posso creare dynamicmente un elenco di tutti i componenti ui di Android a livello di programmazione? ad es. TextView, ImageView ecc

Sto creando un programma, e all’interno del quale ho bisogno di creare un elenco di tutti i diversi componenti Android, ma piuttosto che capire e digitare la lista a mano. Mi piacerebbe capire a livello programmatico se potrei realizzare questo per essere aggiunto a String Array come il seguente?

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

Allo stesso modo vorrei creare un elenco di tutti i diversi tipi di dati, ad esempio Int, String, ArrayList, ecc. Da aggiungere a String Array come il seguente

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

Quello che sono stato in grado di fare finora è sopra. Finora li ho digitati fisicamente come sopra.

Come posso realizzare questo? Grazie

Una precisazione

Per tipi di dati: intendo tipi di variabili dichiarate per contenere dati, ad esempio Int, String, object, booleano, doppio, array, arraylists ecc.

Per componenti: intendo qualsiasi componente visuale che può essere aggiunto a un xml di Android, ad esempio, ImageView, TextView, LinearLayout, RelativeLayout ecc.

Sì, so che il numero di questi componenti può essere infinito (determinato dalle API in uso), per cui vorrei generarli dynamicmente

Preferibilmente senza usare la libreria di qualcun altro

Non è necessario utilizzare alcuna libreria di terze parti , poiché Java ha dei riflessi . Questo metodo farà tutto per te e renderà l’ 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 è ansible creare int con reflection, ma è ansible creare Integer , quindi ciò che fondamentalmente è lo stesso.

Un problema con esso ci sono molti più tipi di View e ViewGroup . Ma dipende anche da quanti tipi di Object vuoi creare … Nell’esempio dato diciamo che farò char , String , int , Object e quindi puoi facilmente estenderlo.

 for(String s : arrayWithNames){ if(s.equalsIgnoreCase("int")){ Integer integer = (Integer)createVarInstance(s); //ready to use. Integer, not int! }else if(s.equalsIgnoreCase("String"){ String string = (String)createVarInstance(s); }else if(s.equalsIgnoreCase("char"){ Character character = (Character)createVarInstance(s); //Character, not char! }else if(s.equalsIgnoreCase("Object"){ Object object = (Object)createVarInstance(s); } } 

Poiché tutti questi tipi di dati sono nello stesso pacchetto, per noi è molto più facile. 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 lo si desidera, è ansible effettuare l’unico metodo per pacchetti diversi. Se in futuro si desidera creare più e diversi tipi di variabili, che si trovano in pacchetti diversi, sarà quindi necessario verificare i nomi o eseguire operazioni simili come nell’esempio con View s.

Puoi elencare i componenti dell’interfaccia utente tutte le classi nel pacchetto android.view o nelle sottoclassi android.view.View utilizzando la libreria Reflection :

 Reflections reflections = new Reflections("android.view"); //Reflections reflections = new Reflections("android.view.View"); Set> allClasses = reflections.getSubTypesOf(Object.class); 

Per creare un elenco di tutti i tipi di dati si potrebbe fare lo stesso sopra usando la class Object, ma prima, personalmente, mi chiedo a che scopo farlo.

Reflections è una fantastica libreria per Java. Non sono sicuro che funzioni anche su Android. Qualcuno ha aperto un problema , è stato chiuso subito dopo senza alcuna spiegazione.

Se riesci a farlo funzionare su Android, puoi utilizzare questo codice per ottenere tutti i componenti:

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

Se lo desideri, puoi ripetere questa procedura con il pacchetto android.view , dove si trovano altre classi come ViewGroup .

Inoltre, se vuoi veramente una matrice di stringhe, prendi i nomi delle classi:

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


Se la soluzione di cui sopra non funziona per te, prova a prendere le lezioni 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.

che ne dici di usare una fabbrica per creare componenti come questo:

 public class ComponentFactory { private HashMap mMap; public ComponentFactory(Context context) { mMap = new HashMap(); mMap.put("TextView", new TextView(context)); ... ... } public View getComponent(String name) { View v = mMap.get(name); if (v == null) { throw new IlllegalArgumentException(); } return v; } }