10
votes

Comment déterminer de manière programmatique quelle mise en page XML mes applications Android utilise?

Comment déterminer de manière programmative quelle mise en page (mise en page-normale, mise en page-grande, etc.) mon application utilise actuellement? Je vois le getwindowManager (). GetDefaultDisplay (). GetMétrictrics (métriques) Appel, mais il semble que la densité de l'écran mais ne soit pas nécessaire quelle mise en page l'application utilise. J'ai besoin d'informations car j'ai besoin de modifier de manière programmative une partie du positionnement des vues de manière dynamique au moment de l'exécution.

Merci d'avance.


0 commentaires

6 Réponses :


0
votes
ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();
The id tells you which layout you're using (assuming you set the id tag in the XML).

1 commentaires

Hmmm. J'ai essayé avec ma vision de relativation: relativelayout content = (relativelayout) vue.getchildat (0); et il provoque une exception de caractères: java.lang.classcastException: android.widget.frameLayout . Une idée pourquoi?




32
votes

Un moyen extrêmement facile de le faire, c'est en définissant un identifiant et une étiquette à la disposition parent et dans votre Oncreate () , vous pouvez wedervied () et < code> gettag () . xxx

puis, dans votre Oncreate méthode, xxx


1 commentaires

Vous devriez pouvoir ignorer le test de balise si vous donnez simplement la mise en page parent dans chacune des variations un identifiant différent.



22
votes

J'ai eu le même problème. Si vous utilisez mise en page code> / layout-sw600dp code> / layout-sw720dp code>, les suivants ont pris fin à travailler pour moi:

Configuration config = activity.getResources().getConfiguration();

if (config.smallestScreenWidthDp >= 720) {
  // sw720dp code goes here
}
else if (config.smallestScreenWidthDp >= 600) {
  // sw600dp code goes here
}
else {
  // fall-back code goes here
}


1 commentaires

Oui, cela devrait être la réponse valide.



3
votes

Le code suivant vous aidera. Je viens d'imprimer une catégorie de taille d'écran ou de densité correspondante. Vous pouvez faire ce que vous voulez!

//Determine screen size
    if ((getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) 
    {     
        Log.d("Screen Size: ", "LARGE");

    }
    else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {     
        Log.d("Screen Size: ", "NORMAL");

    } 
    else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {     
        Log.d("Screen Size: ", "SMALL");
    }
    else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {     
        Log.d("Screen Size: ", "XLARGE");
    }
    else {
        Log.d("Screen Size: ","UNKNOWN_CATEGORY_SCREEN_SIZE");
    }




    //Determine density
    DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int density = metrics.densityDpi;

        if (density==DisplayMetrics.DENSITY_HIGH) {
            Log.d("Screen Density: ","HIGH");
        }
        else if (density==DisplayMetrics.DENSITY_MEDIUM) {
            Log.d("Screen Density: ","MEDIUM");
        }
        else if (density==DisplayMetrics.DENSITY_LOW) {
            Log.d("Screen Density: ","LOW");
        }
        else if (density==DisplayMetrics.DENSITY_XHIGH) {
            Log.d("Screen Density: ","XHIGH");
        }
        else if (density==DisplayMetrics.DENSITY_XXHIGH) {
            Log.d("Screen Density: ","XXHIGH");
        }
        else {
            Log.d("Screen Density: ","UNKNOWN_CATEGORY");
        }


0 commentaires

1
votes

C'est une vieille question, mais je voudrais partager ma façon de résoudre ce problème.

Créer un valeurs - * variante correspondant à chaque configuration que vous souhaitez confirmer programmation, à l'intérieur duquel vous définissez les valeurs appropriées décrivant la configuration actuelle:

Comme vous pouvez le voir, la valeur booléenne is_landscape existe aussi bien dans valeurs et valeurs des terres , il est donc possible d'accéder en toute sécurité via R.bool.is_landscape .

La seule différence, cependant, est la valeur:

getResources () getBoolean (R.bool.is_landscape).. evalue true en mode paysage, et false sinon

Remarque : bien sûr qu'il est possible d'utiliser getResources () getConfiguration () Orientation afin d'obtenir l'orientation de l'appareil en cours, bien que je choisi d'utiliser.. ce cas simple familier pour faire mon exemple clair et simple.

Il est important de comprendre que cette technique est polyvalent, en utilisant que l'on peut définir un répertoire des valeurs plus complexes de ressources (par exemple valeurs ldrtl-sw600dp-v23 ) pour soutenir une configuration plus spécifique.


0 commentaires