2010-08-20 1 views
1

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

Мне просто интересно, как я могу достичь этого без ошибок компиляции в моем проекте Eclipse. Я имею в виду, что проект настроен для конкретной цели (1.5, 2.1 ...), поэтому, если класс в моем проекте несовместим с выбранной целью, это приведет к ошибкам.

Есть ли способ экспортировать эти классы, даже если они не подходят для платформы (я думал об отдельной библиотеке, но опять же: как скомпилировать классы тезисов в lib без компиляции pbs?)? Это должно быть хорошо, так как они не будут загружены, пока я не попрошу их после проверки версии Android.

Спасибо!

ответ

0

Вы можете использовать Class.forName загружать различные классы в зависимости от различных условий:

public interface MyType {} 
public class MyTypeOn15 implements MyType {} 
public class MyTypeOn16 implements MyType {} 
public class MyTypeOn20 implements MyType {} 
// ... 

и где-то в вашем коде:

MyType myType = null; 
if (getActualTarget().equals("1.5") { 
    myType = Class.forName("MyTypeOn15").newInstance(); 
} else if (getActualTarget().equals("1.6") { 
    myType = Class.forName("MyTypeOn16").newInstance(); 
} // ... 

Обратите внимание, что вам нужно доступный пустой конструктор в вашей реализации. И getActualTarget() - ваш магический метод, который возвращает цель как идентификатор строки ...

+0

Спасибо за ваш ответ! По волшебному методу вы подразумеваете, что этого не существует, и я должен написать его сам? :) Это то, что я пытаюсь сделать, обратившись к android.os.Build.VERSION_CODES, но этого не существует в 1.5 ... Поэтому мне нужно проверить версию платформы для более старых версий (возможно, отсутствие этого поля может быть критерием?). Я хочу, чтобы этот магический метод существовал :). Но моя проблема заключалась в том, как у вас есть файлы MyTypeOn15.java в моем проекте без ошибок компиляции из-за того, что я выбрал несовместимую цель Android? Спасибо – jillemash

+0

О, это не имеет большого значения. Создавайте отдельные проекты, в которых сопоставляются целевые объекты и классы, и когда вы создаете развертываемое, просто скопируйте все эти классы в одну библиотеку. Затем библиотека содержит классы, которые не будут работать в реальной среде, но это не имеет значения, потому что они не используются и не загружаются. –

+0

О, я думал, что-то вроде этого, но мне хотелось бы сделать это с одним проектом ^^. Но я еще не знаю, как создать библиотеку для Android-проекта (: s). Могу ли я просто «jar» .class-файлы из моих нескольких конкретных проектов на платформе и добавить эту банку в buildPath-> библиотеки в Eclipse для моего проекта «все-в-одном»? Я попробую это, похоже, решение моей проблемы, спасибо! – jillemash

0

Если вы скомпилируете проект с последней целью, то есть 2.2, он все равно будет работать на 1.5.

+0

Это даже не отдаленно. Существует ряд методов (например, в пакете телефонии, например), которые находятся в версии 2.2, но не 1.5. Противоположный _might_ будет правдой, но тогда вы не сможете использовать новые функции. –

+0

Ну, я не говорю, что вы можете использовать любую функциональность 2.2 и работать на 1.5. Я сказал, что вы можете скомпилировать 1.5 совместимый код с 2.2, и он будет работать на 1.5. Этот парень хочет написать такой код, который действительно возможен. –

+0

Ну, я просто не хочу делать гипотезу о обратной совместимости, я имею в виду, представьте, что устаревшее поле в 1.5, наконец, удалено в 2.2? Если бы я построил свой проект в 2.2, я не мог его увидеть, я думаю. Моя цель - это 100% совместимость для каждой версии. Но я не говорю, что ваше решение не будет работать между 1.5 и 2.2 ... Но может быть, между 1.0 и 3.0 + ... Но спасибо! – jillemash