Это не работает с текущим макетом. Вы должны использовать шаблон стратегии. В вашей библиотеке определите LibA с помощью конструктора, который принимает в конструктор объект типа LibB:
class LibA{
LibB b;
public LibA(LibB b)
this.b = b;
}
}
Затем вы можете переопределить LibB в своем проекте и создать LibA с классом, расширяющим LibB:
class ProjectB extends LibB{
}
LibA a = new LibA(new ProjectB());
Ответ на вопрос Turbos:
Вы хотите запустить Project-Activity из вашей библиотеки. Затем переместите код, который создает Intent
в ваши проекты , потому что только в вашем проекте вы знаете тип или имя Activity
, которое должно быть запущено.
Решение, которое вы упомянули в своем комментарии ( здесь ), создает Intent
в проекте библиотеки, угадывая имя Activity
, которое должно быть запущено. В этом нет ничего плохого, но это не элегантное решение. Вы можете запустить только Activities
, которые следуют этой специальной схеме именования. И из-за этого вы не можете запускать произвольные Activities
, которые видны в ваших проектах, например Activities
, из других библиотек, где вы не можете изменить имя класса.
Чтобы переместить создание Intent
в свои библиотеки, вы можете использовать стратегию, шаблон или шаблон фабричного метода. См. Шаблоны проектирования в Википедии , чтобы узнать еще больше (творческих) шаблонов, соответствующих дизайну вашей библиотеки.
Простое решение будет:
Создайте реферат LibraryActivity
и расширьте ваши ProjectActivities из него LibraryActivity
определяет абстрактный метод, который возвращает Intent
. Реализация этого абстрактного метода выполняется в вашем ProjectActivities
.
abstract class LibActivity{
private void doSomething(){
//Library does something
//and finally calls createIntent() to start an project specific Activity
startActivity(this.createIntent());
}
protected abstract Intent createIntent();
}
class ProjectActivity extends LibActivity{
protected Intent createIntent(){
return new Intent(ProjectActivity.this, AnyActivityYouWant.class);
}
}