Как программно определить, какой формат 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) для поддержки более конкретной конфигурации.