Один APK, который запускает другое действие, если его мобильный или планшет (Android 2.1+) - PullRequest
3 голосов
/ 20 января 2012

Я много искал и не нашел нужной информации для этого.У меня есть 2 различных мероприятия в моем проекте.На старте было 2 разных приложения, одно для мобильного и одно для планшета.Я хочу смешать их, чтобы получить только один APK.Поэтому, когда они были отделены друг от друга, это было легко, но смешивать 2 манифеста я не для меня. Я хотел бы иметь возможность иметь 2 разных вида деятельности и один запуск правильно, если это мобильный телефон, а другой - если это планшет.

У кого-нибудь есть пример манифеста, который может это сделать?

Ответы [ 3 ]

6 голосов
/ 20 января 2012

Чтобы расширить ответ Слейтона, в заставке (или в панели запуска без интерфейса) вам нужно будет определить, является ли это планшетом.Вам нужно будет самостоятельно определить, что считать планшетом.Я предполагаю, что вы думаете о размере экрана.Вот простой пример, который я получил отсюда: http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f

Он использует волшебный размер экрана> 6 дюймов, чтобы определить, что это планшет.

public boolean isTablet() { 
    try { 
        // Compute screen size 
        DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
        float screenWidth  = dm.widthPixels / dm.xdpi; 
        float screenHeight = dm.heightPixels / dm.ydpi; 
        double size = Math.sqrt(Math.pow(screenWidth, 2) + 
                                Math.pow(screenHeight, 2)); 

        // Tablet devices should have a screen size greater than 6 inches 
        return size >= 6; 
    } catch(Throwable t) { 
        Log.error(TAG_LOG, "Failed to compute screen size", t); 
        return false; 
}

Как только активность запуска определяетэто планшет или нет, просто запустите соответствующую активность.

4 голосов
/ 20 января 2012

Допустим, у вас есть два действия: PhoneActivity и TabletActivity. Создайте третье действие под названием SplashActivity. Думайте о SplashActivity как о заставке или панели запуска, которая работает только в течение доли секунды. Когда ваше приложение запускается, SplashActivity запускает, определяет, является ли устройство телефоном или планшетом, а затем запускает соответствующую активность (PhoneActivity или TabletActivity).

0 голосов
/ 26 января 2017

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

Лучший совет, вероятно, в:

https://developer.android.com/guide/practices/tablets-and-handsets.html

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

Оба действия были написаны как стандартные - без использования каркасов. Основное изменение, которое я должен был сделать, - это реструктурировать DetailActivity в качестве фреймворка с очень тонким действием вокруг него. Если бы я следовал связанным рекомендациям, я бы также реструктурировал MainActivity аналогичным образом, но я этого не сделал - казалось бы, в этом нет реальной необходимости. Вместо этого я переписал MainActivity для обработки того, присутствует ли DetailFragment или нет - например, когда вы нажимаете на даты, он либо обновляет фрагмент напрямую, либо создает намерение открыть DetailActivity. Ключевой частью этого является утверждение:

mDetailFragment = (DetailFragment) getSupportFragmentManager().findFragmentById(R.id.frag_detail);

, который идет в методе onCreate () действия после SetContentView (). Укажите здесь, если фрагмент не существует в макете, тогда возвращается значение null - в последующем коде есть несколько мест по строкам «if (mDetailFragment! = Null)».

При том, что это просто вопрос наличия разных макетов для планшетов. В настоящее время рекомендуется использовать наименьшую ширину экрана, поэтому для макета планшета используйте каталог layout layout-sw600dp. На самом деле в моем сценарии использования я хотел использовать разные макеты для альбомной ориентации (подробности справа) и портретной (подробности ниже), поэтому у меня были отдельные версии layout-sw600dp-land и layout-sw600dp-port основного файла макета активности.

Один удар по этому, и если есть проблема с этим подходом, то это то, что другие файлы макета также могут нуждаться в дублировании. Например, макет существующего DetailsActivity уже имеет разные книжную и альбомную версии - оптимизируя пространство экрана. Получается, что если вы поместите детали справа на планшет, то экранное пространство нуждается в книжной ориентации - пространство больше, чем шире. По крайней мере, это верно для моего использования. Точно так же пространство фрагмента, когда планшет находится в портретном положении, естественно имеет ландшафтную форму. Чтобы обойти это, я копирую файл frag_detail.xml из layout-land в layout-sw600dp-port. Если я изменю один из этих файлов, я должен изменить оба. Было бы неплохо не иметь!

...