Android: поддержка ScreenSize для 8- и 7-дюймового экрана

У меня есть проблема, которую я не могу решить в последнее время.

У меня есть простое приложение для планшета, которое я запускаю на своем Samsung Galaxy Note 8.0. Я установил макет, чтобы разместить текстовое представление в каком-то месте. Я кодирую его в xml, используя dp для поля и sp для размера текста. Для макета ширины и высоты задано значение wrapcontent. Но когда я запускал его в моем друге Samsung Galaxy Tab 2 7.0, раскладка не соответствовала тому, что я вижу в своем устройстве. То же самое происходит, когда я пытаюсь запустить его в 10-дюймовом эмуляторе.

Я использую layout-sw600dp для моей папки макета.

Почему мой макет экрана такой? Хотя я использую layout-sw600dp, макет якобы настраивается сам. Или я ошибаюсь в этом?

Я прочитал документацию по Android, касающуюся поддержки различных размеров экрана, и до сих пор я обнаружил, что использование layout-sw600dp является хорошим решением.

Я проверил устройство dpi, используя:

Display display = getWindowManager().getDefaultDisplay();
           DisplayMetrics outMetrics = new DisplayMetrics ();
            display.getMetrics(outMetrics);

            float density  = getResources().getDisplayMetrics().density;
            float dpHeight = outMetrics.heightPixels / density;
            float dpWidth  = outMetrics.widthPixels / density;

person iwalyfa    schedule 02.11.2013    source источник


Ответы (2)


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

Android — поддержка нескольких экранов

person Rahul Gupta    schedule 02.11.2013
comment
Я читал его несколько раз. Я понимаю, что мне нужно предоставить разные макеты для разных размеров ... но мне действительно нужно предоставить разные макеты для 7- и 8-дюймового экрана? В моем xml я использую layout_margin со 100dp (пример ).. - person iwalyfa; 02.11.2013
comment
@iwalyfa - Все имеет значение, проверьте dpi устройства,.,.если они разные, то вам нужны разные папки макетов, проверьте соотношение пикселей, все имеет значение, когда речь идет о макетах Android - person Rahul Gupta; 02.11.2013
comment
Я отредактировал свой пост.. Я проверил разрешение устройства.. Нужен ли мне другой макет в моем случае? Когда я думаю об этом, это означает, что мне нужно предоставить много макетов для разных размеров экрана.. - person iwalyfa; 02.11.2013
comment
Да, это на самом деле головная боль, многие 7-дюймовые устройства могут иметь разные dpi, поэтому происходят изменения макета.., попробуйте создать несколько папок для макетов для устройств, на которых вы считаете, что ваше приложение будет работать.. если вы декомпилируете популярные приложения, вы увидеть много папок с макетами - person Rahul Gupta; 02.11.2013
comment
Ясно.. Спасибо за ваш совет.. Думаю, мне нужно сделать несколько макетов, по крайней мере, для другого размера экрана.. Последний вопрос: делает ли приложение много макетов медленнее? - person iwalyfa; 02.11.2013
comment
Нет, файл макета .xml является статическим файлом и занимает очень мало места в памяти. Так что не беспокойтесь о том, что ваше приложение работает медленно. - person Rahul Gupta; 02.11.2013

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

public static float getScreenInchSizeByDensityDpi(Context context) {
    DisplayMetrics dm = context.getResources().getDisplayMetrics();
    double x = Math.pow((double)dm.widthPixels / (double)dm.densityDpi, 2);
    double y = Math.pow((double)dm.heightPixels / (double)dm.densityDpi, 2);
    double screenInches = Math.sqrt(x + y);

    return (float) screenInches;
}

public static float getScreenInchSizeByXYDpi(Context context) {
    DisplayMetrics dm = context.getResources().getDisplayMetrics();
    double x = Math.pow((double)dm.widthPixels / (double)dm.xdpi, 2);
    double y = Math.pow((double)dm.heightPixels / (double)dm.ydpi, 2);
    double screenInches = Math.sqrt(x + y);

    return (float) screenInches;
}
person pjq    schedule 02.12.2014