Как бороться с несколькими размерами экрана + динамическим управлением в Android? - PullRequest
3 голосов
/ 23 апреля 2010

Я учусь программировать на телефоне Android. Однако я не уверен, как заставить мое приложение работать на экранах разных размеров и разрешений.

Я прочитал учебник на сайте Android и до сих пор не знаю, как это сделать.

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

Так что я не уверен, как Android изменить размер динамических элементов управления в зависимости от размера экрана.

Я также читал, что создавать элементы управления в любом месте, кроме файла xml, - плохая практика, поскольку он разделяет логику представления и логику программирования. Однако они никогда не говорят о том, нужно ли вам динамически создавать эти элементы управления, что вам следует делать.

Так есть ли другой способ сделать это, который считается хорошей практикой?

Редактировать

Я получаю эту ошибку при попытке запустить приложение Switcher.

[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: Error type 2
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: Error: Unable to connect to activity manager; is the system running?
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: usage: am [start|broadcast|instrument|profile]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: am start [-D] INTENT
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: am broadcast INTENT
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: am instrument [-r] [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-w] <COMPONENT>
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: am profile <PROCESS> [start <PROF_FILE>|stop]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: INTENT is described with:
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-c <CATEGORY> [-c <CATEGORY>] ...]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[2010-04-27 12:06:41 - ViewSwitcherTest] ActivityManager: [-n <COMPONENT>] [-f <FLAGS>] [<URI>]

На ваш вопрос: это динамично, потому что кнопки в моем примере растут и сжать в зависимости от одного из 3 возможные размеры, потому что они используют масштабированный пиксель (вы, вероятно, знаете, что вам не нужно иметь дело с экраном размеры сама). Итак, масштабированный пиксель по сравнению с реальным пиксель имеет размер 0,75px, 1,0px или 1,5px. Android автоматически и динамически настраивается это к реальному размеру. Так ты не Об этом нужно позаботиться в вашем коде.

Так что, если я использую масштабированные пиксели, мне не нужно беспокоиться о разном размере экрана?

На данный момент я не знаю пример кроме как в играх, где вам приходится иметь дело с «реальным» пикселем. Но если вы хотите использовать умножьте его на значение плотность тока. Это ваше "соотношение". У меня нет примера с мячом больше, но у меня есть другой, который использует та же техника. Вы можете запустить его на разные размеры экрана, и вы будете видеть, что кнопки всегда будут соответствовать в макет. Вы могли бы использовать та же техника для ваших целей. В этот пример вы можете прокрутить с Кнопки "Scrn" из одного вида в еще один из 4 просмотров. (В данный момент все они имеют черный фон, так Вы не видите, что они разные Просмотры). Кнопка «Ввод» выходит из тестовое задание. Это проект Eclipse. Вы можете скачать

Так, если я хочу иметь дело с соотношением, то я использую реальные пиксели, а не масштабированные пиксели? Какое преимущество это дает мне?

будут ли масштабированные пиксели работать при смене портрета на альбомную (т. Е. Будет ли заполнять новое найденное пространство)?

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

checkbox label label

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

Спасибо ♠

Ответы [ 3 ]

0 голосов
/ 27 апреля 2010

На ваш вопрос: Это динамично, потому что кнопки в моем примере растут и сжимаются в зависимости от одного из трех возможных размеров, потому что они используют масштабированный пиксель (вы, вероятно, знаете, что вам не приходится иметь дело с размерами экрана). Таким образом, масштабированный пиксель по сравнению с реальным пикселем имеет размер 0,75px, 1,0px или 1,5px. Android автоматически и динамически настраивает его на фактический размер. Так что вам не нужно заботиться об этом в своем коде. На данный момент я не знаю примера, кроме как в играх, где вам приходится иметь дело с «реальным» пикселем. Но если вы хотите использовать его, умножьте его на значение плотности тока. Это ваше "соотношение". У меня больше нет примера с мячом, но у меня есть другой, использующий ту же технику. Вы можете запустить его на разных размерах экрана, и вы увидите, что кнопки всегда будут соответствовать разметке. Вы можете использовать ту же технику для ваших целей. В этом примере вы можете прокручивать с помощью кнопок «Scrn» от одного представления к другому из 4 представлений. (На данный момент все они имеют черный фон, так что вы не видите, что это разные взгляды). Кнопка «Ввод» выходит из теста. Это проект Eclipse. Вы можете скачать его здесь: http://android.pithax.net/ViewSwitcherTest.zip

0 голосов
/ 28 апреля 2010

Так что, если я использую масштабированные пиксели, мне не нужно беспокоиться о разном размере экрана?

По-моему, я бы сказал, да. По крайней мере, это мой подход к разным размерам экрана.

Так что, если я хочу иметь дело с соотношением, то я использую реальные пиксели, а не масштабированные пиксели? Какое преимущество это дает мне?

Каждое значение пикселя в вашем коде является «реальным» пикселем. например в моем примере view1.setHeight ((int) (350 * плотность)); Если бы я не умножил его на плотность, он всегда был бы 350px, а не 350sp. Нет способов доставки пикселей разного типа, например sp, dip или px. Единица всегда пиксельная. И если вы используете динамический макет (с масштабированным пикселем), вы должны позаботиться о том, чтобы все ваши пиксели, которые вы установили в коде, имели одинаковое соотношение. Android знает, что такое соотношение (плотность), поэтому вам всегда нужно умножать его на плотность, чтобы убедиться, что у вас всегда есть правильное соотношение для каждого размера экрана. Это преимущество, которое вы получаете с этим методом. Вероятно, вам будет понятно, как работает мой пример.

will scaled pixels work with changing from portrait to landscape( ie will it fill up the new found space)?

Scaled Pixels позаботится о том, чтобы соотношение в каждом размере было одинаковым. Это означает, что ваш ландшафтный дизайн, который вы определили, будет выглядеть на всех экранах одинаково.

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

флажок метка метка

Это может быть одна запись или 10000 записей Я не знаю, так что это должно быть прилагается к чему-то, что похоже на панель окна (элементы управления там получить полосу прокрутки).

Теперь я понимаю, что вы имеете в виду. Это 2 разные темы. Во-первых, ваши результаты будут выглядеть одинаково на каждом экране. Это то, о чем мы говорим все время.

Полагаю, проблема с этими динамическими записями не решаема с предопределенным xml. Я бы сделал это по коду в любом случае (в моем примере я также добавил представления по коду). Я не уверен, какой подход может быть лучшим, но, возможно, макет таблицы, в которой вы добавляете столько строк, сколько вам нужно с помощью кода. У меня пока нет такого опыта, но я думаю, что это не очень сложно. Я думаю, что в примерах Android есть даже похожий пример.

Для моего приложения: Что говорит "./adb logcat"? Если вы не можете приступить к работе, создайте новый проект Android с уровнем API 4, измените структуру файла, как в моем проекте (на самом деле вам нужно только удалить drawable-ldpi и hdpi и переименовать третий в «drawable») , И вы должны использовать то же имя пакета. В противном случае он потерпит крах. На самом деле лучше создать новый проект Android. Возможно, произошел сбой, потому что вы не указали правильное имя пакета (net.pithax.viewswitchertest). В zip это папка, так что вы все равно не сможете запустить zip.

0 голосов
/ 25 апреля 2010

Я никогда не использовал разные файлы или каталоги, хотя я всегда обрабатываю все возможные размеры экрана. То, как вы справляетесь с тремя различными размерами, зависит от того, что вы планируете делать. Я думаю, что масштабированные пиксели в вашем xml - это все, что вам нужно для вашего приложения. Посмотрите на последнюю ветку одного из моих сообщений. Я думаю, что это даст вам подсказку, чтобы решить вашу проблему:

Обработка правильного соотношения пикселей на экранах разных размеров

Когда вам также нужно знать плотность (например, для вычисления правильного соотношения движения пикселей в играх, вы можете объединить «масштабированный пиксель» в макете с плотностью, получаемой из класса DisplayMetrics:

public class YourActivity extends Activity {

private DisplayMetrics metrics = new DisplayMetrics();
private float density;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    density = metrics.density;  
    ....

}

Плотность может быть только 0,75, 1,0 или 1,5. Таким образом, вы можете использовать эти значения для своих нужд, например, для «пиксельного мудрого» движения графики. Это подход, который я использую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...