2013-07-01 1 views
3

У меня есть проект библиотеки A и дочерний проект B. Единственное отличие в B состоит в том, что для одного действия необходим дополнительный код (например, для объявлений)Правильное расширение/переопределение библиотеки Активность, эффективно заменяющая ее в новом проекте?

Я знаю, что могу просто скопировать A.Activity to B и добавьте код, но если я изменю код в A, он не будет в B, так что это не вариант.

Как продлить A.Activity на B.Activity и добавить небольшой код, сохранив его в месте манифеста (Так, нажав кнопку в B.Activity 1, я перехожу к B.Activity 2 (который простирается от A.Activity)

Подробный сценарий:.

в проекте А, при нажатии на кнопку в FirstActivity, я иду в SecondActivity Я хочу, чтобы переопределить SecondActivity, когда в проекте в, я нажимаю на FirstActivity (который тот же, что и у A) Я перехожу к SecondActivity, который переопределен/расширен.

ответ

1

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

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

Конфигурация по умолчанию находится в проекте библиотеки, а затем я просто переопределяю ее в xml в дочернем проекте.

+0

Хм. Это звучит как довольно жизнеспособный обходной путь. Мне нравится идея, однако я пока не буду отмечать ее как ответ, так как это скорее обходной путь, чем ответ. – user1810737

+0

Несомненно, я столкнулся с определенными проблемами (проект библиотеки не знает о расширенной деятельности ... так как вы его запускаете и т. Д.) - он просто очень запутан и запутан. Теперь я делаю все так, кажется мне чище. –

2

В проекте child/non-lib создайте новую активность y (позволяет называть его дочерней активностью), которая продолжается от действия в проекте lib (родительский). Затем переопределите метод (ы), который вы хотите изменить.

В манифесте для дочернего проекта вам нужно будет добавить дочернюю активность и (я полагаю) сделать его запуском, предоставив ему соответствующий фильтр намерений.

Если это не действие запуска, возможно, у вас также возникла проблема намерения в проекте библиотеки, пытающегося запустить стандартную (не переопределенную) версию Activity. Я преодолел это, прежде чем использовать своего рода «динамическую» систему намерений, в которой вместо жесткого кодирования типа класса для намерения я получаю его из объекта Application, который возвращает тип.

например

В библиотеке проекта:

public class MainActivity extends Activity { 

private void launchOverideableActivity(){ 

    MyApp app = (MyApp) getApplication(); 
    Intent i = new Intent(this, app.getIntentClassType()); 
    startActivity(i); 
}} 

и переопределить объект приложения, так что вы можете поставить этот динамический тип класса:

public class MyApp extends Application { 

public Class getIntentClassType(){ 
    return MainActivity.class; 
}} 

Затем в детском проекте, расширить деятельность и выполняйте свою работу. Но также переопределить объект приложения из библиотеки проекта и переопределить метод, но вернуть изменённый тип класса активности:

public class OveriddenApp extends MyApp { 

@Override 
public Class getIntentClassType() { 
    return MyOveriddenActivity.class; 
}} 

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

Я хотел бы знать, если есть более элегантный способ сделать это ...

+1

Нет, не запуск деятельности. Я уже пытался расширить его; Я могу легко добавить код и еще много чего, но я не могу правильно его использовать при переходе от FirstActivity к SecondActivity. – user1810737

+0

Думаю, я вижу вашу проблему, см. Мое редактирование –

+1

А, я понимаю, что вы имеете в виду. Поэтому он берет активность на основе приложения вместо жестко закодированного пакета. Но теперь моя проблема заключается в том, что моя дочерняя деятельность проекта не может иметь то же имя, что и активность библиотеки. Поэтому я не могу так или иначе ссылаться на одно и то же название деятельности (я получаю сообщение об ошибке). Eclipse думает, что я хочу расширить свою деятельность от себя. Редактирование: я думаю, что я исправил эту проблему, используя полное имя пакета для 'extends activity'. – user1810737