Как программно определить, какой XML-макет используется в моих приложениях для Android?

Как программно определить, какой макет (макет-обычный, макет-большой и т. Д.) Мое приложение в настоящее время использует? Я вижу вызов getWindowManager (). GetDefaultDisplay (). GetMetrics (metrics), но кажется, что он имеет дело только с плотностью экрана, но не является необходимым, какой макет использует приложение. Мне нужна информация, так как мне нужно программно изменять некоторые положения динамически во время выполнения.

Заранее спасибо.

Ответы на вопрос(7)

Это старый вопрос, но я хотел бы поделиться своим способом решения этой проблемы.

Создатьvalues-* вариант, соответствующий каждой настройке, которую вы хотите подтвердить программно, внутри которой вы определите правильные значения, описывающие текущую конфигурацию:

enter image description here

Как видите, логическое значениеis_landscape существует как вvalues а такжеvalues-landследовательно, к нему можно безопасно получить доступ черезR.bool.is_landscape.

Единственная разница, однако, заключается в значении:

getResources().getBoolean(R.bool.is_landscape); оцениваетtrue в ландшафтном режиме иfalse иначе.

Note: конечно что можно использоватьgetResources().getConfiguration().orientation чтобы получить текущую ориентацию устройства, хотя я решил использовать этот простой знакомый случай, чтобы сделать мой пример понятным и понятным.

Важно понимать, что этот метод является универсальным, используя который можно определить каталог ресурсов с более сложными значениями (например,values-ldrtl-sw600dp-v23 ) для поддержки более конкретной конфигурации.

Я искал то же самое! Я нашел 2 похожих квестона / ответа:

Получение ScreenLayout

Использование ScreenLayout Bitmask

Хотя все три вопроса по сути одинаковы, вам нужны оба ответа, чтобы получить свой результат.

Я использовал этот код, чтобы получить размер макета в моей деятельности:

int layoutSize = getResources().getConfiguration().screenLayout;
layoutSize = layoutSize & Configuration.SCREENLAYOUT_SIZE_MASK;

Первая строка вернет размер макета, но это будет число, почти равное максимальному размеруint.

Во второй строке будет И размер макета с заданной маской. Маска имеет значение 15 в десятичном виде или F в шестнадцатеричном.

Возвращаемое значение находится в диапазоне от 0 до 3. Значения, соответствующие размерам экрана, а также значению маски размера, определяются как константы вandroid.content.res.Configuration учебный класс:Документация по настройке Android.

Все, что вам нужно сделать после двух предыдущих строк, это иметь какой-то оператор switch, сравнивающий возвращаемое значение.layoutSize сConfigurationпредварительно определенные значения дляSCREENLAYOUT_SIZE_XXX.

Надеюсь, вам еще не поздно его использовать. Моя проблема заключалась в том, что я не знал, как задать вопрос на точном языке Android. Вероятно, поэтому один и тот же вопрос задавался и, вероятно, должен быть задан так многими разными способами.

Следующий код поможет вам. Я только что напечатал соответствующий размер экрана или категорию плотности. Ты можешь делать что хочешь!

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

У меня такая же проблема. Если вы используетеlayout/layout-sw600dp/layout-sw720dp, у меня закончилось следующее:

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
}

Чрезвычайно простой способ сделать это, установив идентификатор и тег для родительского макета и в вашемonCreate(), вы можетеfindViewById() а такжеgetTag().

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/my_activity_view"
    android:tag="big_screen" >
        // misc views~
</RelativeLayout>

А потом, в вашемonCreate метод,

if(findViewById(R.id.my_activity_view).getTag().equals("big_screen")) {
    // do stuff
}

почему вы не можете указать, какая позиция должна быть в xml? таким образом, когда вызывается этот конкретный тип макета, вам не нужно ничего делать программно?

Вы можете использовать различные типы папок, такие какlayout, layout-sw600dp, layout-sw720dp так далее

увидетьhttp://developer.android.com/guide/topics/resources/providing-resources.html для разных конфигураций

ViewGroup view = (ViewGroup)getWindow().getDecorView();
LinearLayout content = (LinearLayout)view.getChildAt(0);
int id = content.getId();

Идентификатор указывает, какой макет вы используете (при условии, что вы установили тег id в XML).

Ваш ответ на вопрос