java - studio - layout android definition




Comment créer dynamiquement une liste de tous les composants d'interface utilisateur Android par programmation? par exemple, TextView, ImageView, etc. (3)

Vous pouvez répertorier les composants de l'interface utilisateur toutes les classes dans le package android.view ou les sous-classes android.view.View l'aide de la bibliothèque Reflection :

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

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

Pour créer une liste de tous les types de données, vous pouvez faire la même chose en utilisant la classe Object, mais d'abord, je me demande personnellement à quoi cela sert.

Je crée un programme et dans lequel j'ai besoin de créer une liste de tous les différents composants Android, plutôt que de trouver et de taper la liste à la main. Je voudrais savoir par programmation si je pourrais accomplir ceci pour être ajouté à des tableaux comme ci-dessous?

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

De même, je voudrais créer par programmation une liste de tous les différents types de données, par exemple Int, String, ArrayList, etc. à ajouter aux tableaux comme ci-dessous.

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

Ce que j'ai pu faire jusqu'ici , c'est ci-dessus. Jusqu'à présent, je les ai physiquement saisis comme ci-dessus.

Comment puis-je accomplir cela? Merci

Clarification

Par types de données: j'entends les types de variables déclarés pour contenir des données, par exemple Int, String, objet, booléen, double, tableaux, arraylists, etc.

Par composants: Je veux dire tout composant visuel qui peut être ajouté à un fichier xml Android, par exemple ImageView, TextView, LinearLayout, RelativeLayout, etc.

Oui, je sais que le nombre de ces composants peut être infini (déterminé par les API utilisées), pour lequel je souhaite les générer dynamiquement

De préférence sans utiliser la bibliothèque de quelqu'un d'autre


que diriez-vous d'utiliser une fabrique pour créer un composant comme celui-ci:

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;
    }
}

Vous n'avez pas besoin d'utiliser de bibliothèques tierces , car Java a des reflections . Cette méthode fera tout pour vous et rendra l’ UI sans problème:

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

Et 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;
}

C'est tout. Vous avez tout pour gérer tout type de View . J'ai testé le code ci-dessus et utilisé dans le projet. Ça marche très bien. Même situation avec d'autres Object . Vous ne pouvez pas créer int avec reflet, mais vous pouvez créer Integer , donc ce qui est fondamentalement identique.

Un problème avec cela, il y a beaucoup plus de types que juste View et ViewGroup . Mais cela dépend aussi du nombre de types d' Object vous voulez créer ... Dans l'exemple donné, disons que je ferai char , String , int , Object et que vous pourrez facilement l'étendre.

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);
    }
}

Comme tous ces types de données sont dans le même paquet, cela nous simplifie beaucoup la tâche. Méthode 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;
}

Si vous le souhaitez, il est possible de créer une méthode unique pour différents packages. Si, à l'avenir, vous souhaitez créer d'autres types de variables, qui se trouvent dans des packages différents, vous devrez vérifier les noms ou effectuer des opérations similaires, par exemple avec View s.





android-activity