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

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

Спасибо заранее.

Ответ 1

Чрезвычайно простой способ сделать это, установив id и тег в родительский макет и в 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
}

Ответ 2

У меня была та же проблема. Если вы используете 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
}

Ответ 3

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

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

Ответ 4

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

Получение ScreenLayout

Использование битовой маски ScreenLayout

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

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

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. Вероятно, поэтому тот же вопрос был, и, вероятно, должен был быть задан так много разных способов.

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

введите описание изображения здесь

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

Единственное различие, однако, - это значение:

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

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

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