Intereting Posts
Можно ли найти другие близлежащие телефоны? Как вы скомпилируете проект Android в файл .apk в Eclipse без запуска эмулятора? Возможно ли для Android VM собирать статические переменные без уничтожения всего приложения Android? Повернуть рамку, содержащую динамические кнопки Отправить запрос на отправку вместе с HttpHeaders на Android Откройте встроенную камеру Android с помощью OpenCV Как подключить мобильный телефон и принтер через Bluetooth в Android? Что нового в Drawable Tinting в Android L Developer Preview по сравнению с предыдущей версией? Включение функции увеличения размера экрана в приложении Phonegap Android не влияет Изменить размер Android-Seekbar? Попытка закончить входное событие, но приемник событий ввода уже был удален Какую платформу ведения журнала Android использовать? Центрирование растрового маркера (Google Maps Android API v2) Можно ли использовать BLE с поддержкой Android / iPhone в качестве маяка BLE? Предотвращение примененияНеответчик во время отладки

Начало деятельности из Android-библиотеки-проекта

После долгого поиска я не нашел подходящего решения. У меня есть проект Android-библиотеки с почти всем кодом для приложения. Из основного действия в проекте библиотеки я запускаю Intent для явного действия A. В моем производном проекте, который использует проект библиотеки, я расширил эту операцию A и добавил новый код. Проблема в том, что Суперкласс действия А будет отвечать, а не производный класс.

В манифесте нового проекта, который использует проект библиотеки, я объявил новую активность с новым пакетом.

Вот вызов Intent из проекта библиотеки:

Intent i = new Intent(getApplicationContext(), AndroidActivity.class); startActivity(i); 

Вот производный класс AndroidActivity:

 public class AndroidActivity extends de.app.library.activities.AndroidActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... 

Я не могу перейти к методу onCreate

Манифест из проекта библиотеки:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.app.library" android:versionName="1.0" android:versionCode="1"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".activities.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.AndroidActivity" android:label="@string/act_android" /> </application> 

И вот манифест из нового проекта:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.app.free" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="de.app.library.activities.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.LernenActivity" android:label="@string/act_lernen" /> ? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.app.free" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="de.app.library.activities.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.LernenActivity" android:label="@string/act_lernen" /> 

Так что я:

 de.app.library.activities.AndroidActivity and de.app.free.activities.AndroidActivity 

Я не хотел делать так много изменений в проекте библиотеки, потому что третий проект должен использовать существующий код с нетронутой AndroidActivity

И все это отлично работает для меня. Например, измененные макеты используются из нового проекта.

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

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

Solutions Collecting From Web of "Начало деятельности из Android-библиотеки-проекта"

Когда вы делаете это в своем библиотечном проекте

  Intent i = new Intent(getApplicationContext(), AndroidActivity.class); 

AndroidActivity относится к AndroidActivity проекта библиотеки: проект не знает о других внешних проектах, если вы не включите их в качестве библиотеки. Просто проверьте свой импорт, вы импортируете AndroidActivity и поручаете Android запустить его.

Что, кстати, очевидно, это был бы плохой дизайн, если библиотечный проект должен был знать о производных проектах

Легким решением является переопределение запуска активности в производном проекте, что-то вроде этого:

Libary project Деятельность:

 public void runMyActivity() { Intent i = new Intent(getApplicationContext(), AndroidActivity.class); // You are on the library project, so you can refer to the activities created in it. // the only AndroidActivity known here is the library project's . . } 

Деятельность вашего производного проекта:

 @Override public void runMyActivity() { // You are now on the derived project, so you can refer to // the activities created in it, and also to the library project's. You // just import the package name of the desired activity or use fully qualified // names Intent i1 = new Intent(getApplicationContext(), AndroidActivity.class); // this one will use the activity in the imports Intent i2 = new Intent(getApplicationContext(), de.app.libarary.AndroidActivity.class); // use the activity from the library project Intent i3 = new Intent(getApplicationContext(), de.app.free.AndroidActivity.class); // use the activity from the derived project . . } 

Поэтому, когда вы вызываете runMyActivity () из любого места, он выполняет функцию переопределения (при условии, что активность запуска расширяет активность проекта библиотеки и переопределяет этот метод). И в контексте расширенной функции AndroidActivity.class будет вашей производной деятельностью (или другой, вы можете импортировать любую из них, потому что здесь у вас есть доступ к производным видам деятельности и проекту библиотеки).

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

 Активность android: name = "de.app.library.activities.AndroidActivity"

должно быть

 Активность android: name = "de.app.free.activities.AndroidActivity"

Я имел в виду, AndroidActivity. В некотором роде вы собираете неправильный класс активности из неправильного пакета.