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

8

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

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

Ваш Ответ

7   ответов
20

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
}
Да, это должен быть правильный ответ.
это должен быть принятый ответ
32

установив идентификатор и тег для родительского макета и в вашем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
}
Не работает, всегда получить нулевой указатель без Onclick (View v)
Вы сможете пропустить проверку тегов, если просто дадите родительскому макету в каждом из вариантов другой идентификатор.
Очень хорошее предложение, прекрасно работает.
3

ер экрана или категорию плотности. Ты можешь делать что хочешь!

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

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

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

0

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

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

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

Error: User Rate Limit ExceededlargeError: User Rate Limit Exceededlayout-largeError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Kenny
Error: User Rate Limit Exceeded Kenny
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. Вероятно, поэтому один и тот же вопрос задавался и, вероятно, должен быть задан так многими разными способами.

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

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

Error: User Rate Limit ExceededRelativeLayout content = (RelativeLayout)view.getChildAt(0);Error: User Rate Limit Exceededjava.lang.ClassCastException: android.widget.FrameLayoutError: User Rate Limit Exceeded Kenny

Похожие вопросы