android Как создать свою собственную активность и расширить ее?
Мне нужно создать базовый класс, который расширяет Activity
который выполняет некоторые общие задачи в моем приложении и расширяет мой деятельность из него, в следующем виде:
public BaseActivity расширяет Activity{....}
public SubActivity расширяет BaseActivity{...}
in деятельность мне нужно дать значения некоторым переменным и компонентам пользовательского интерфейса, определенным в BaseActivity, мне может понадобиться определить другой макет для деятельность согласно некоторому значению флага, также(в деятельность) Я хочу выполнить asyncTask, который определен в BaseActivity.
это возможно? если да, то есть ли учебник, который может помочь? заранее спасибо
4 ответа:
что именно вы пытаетесь достичь? Наличие двух разных действий с общим пользовательским интерфейсом, за исключением некоторых переменных или частей макета?
в этом случае я предлагаю иметь базовую абстрактную деятельность и два конкретных наследуемых подкласса. Вы определяете все общее поведение в базовой деятельности и имеете абстрактные методы для различий, которые затем переопределяются в ваших фактических реализациях.
например, для двух видов деятельности с разной компоновкой ресурсы:
public abstract class BaseActivity extends Activity { @Override public void onCreate(bundle) { super.onCreate(bundle); setContentView(getLayoutResourceId()); } protected abstract int getLayoutResourceId(); } public class Activity1 extends BaseActivity { @Override public void onCreate(bundle) { super.onCreate(bundle); // do extra stuff on your resources, using findViewById on your layout_for_activity1 } @Override protected int getLayoutResourceId() { return R.layout.layout_for_activity1; } }
вы можете иметь гораздо более абстрактные методы, для каждого бита, который вы хотите конкретно для ваших подклассов.
делать это, на мой взгляд, намного лучше, чем иметь конкретный подкласс к конкретному суперклассу: это может привести ко многим проблемам и обычно трудно отлаживать.
Да, вы можете, вы должны просто иметь в виду основные правила наследования. Вы унаследуете внутреннюю активность AsyncTask и свойства, определенные в BaseActivity, если вы сделаете их защищенными, а не частными. Из того, что я вижу сейчас, я думаю, что вы должны сделать BaseActivity абстрактным классом, так как на самом деле будут использоваться только экземпляры подактивностей.
вы должны просто начать и попробовать его, он придет и работать легче, чем вы думаете. Если вы наткнетесь на какие-либо проблемы, просто просить.
этот вопрос уже есть очень хорошие ответы.
Однако. мой ответ для тех людей, которые ищут какой-то рабочий пример.
вот полный рабочий ->код
Мы не делаем ничего нового здесь, это так же, как и любой другой сценарий наследования (вы хотите какое-то общее поведение в нескольких местах, но вы хотите написать это поведение только один раз).преимущество: Оно обеспечивает лучшую читаемость кода, ремонтопригодность и бла-бла. Но не после этих-ibility, они не будут иметь значения для вас, если ваш мозг работает как газель.
Мы стремимся к реальной власти наследования "управления". (То же самое происходит и в реальной жизни. Родитель контролирует ребенка :) ) .в моем примере у меня есть два вида деятельности MainActivity и OtherActivity. Оба вида деятельности имеют разный макет, но я хочу, чтобы оба они начинались с некоторой анимации или некоторых приветственное сообщение.
наша первая задача-выяснить общее поведение. здесь - > начать работу с анимацией.
Мы нашли общую "вещь", теперь мы напишем, что поведение в BaseClass (AnimationActivity).
MainActivity и OtherActivity унаследует AnimationActivity.таким образом, код будет выглядеть как'
BaseActivity
AnimationActivity { startAnimation() { .... } }
ребенок Деятельность
MainActivity extends AnimationActivity{ } OtherActivity extends AnimationActivity{ }
этот подход к дизайну обеспечивает много управления и гибкость (МОЩНОСТЬ МОДИФИКАТОРА).
1) Управление: сохранить метод анимации внутри onCreate() Когда вы решите, что действия должны быть начаты с анимации. Держите свой метод внутри метода onCreate (Bundle bundle). Теперь, просто изменив модификатор, вы можете управлять действиями ребенка.
Если вы держите модификатор как
финал: ребенок действия будут начинаться с родительской анимации.
аннотация: детская деятельность должна будет дать свою собственную анимацию.
нет модификатора: дочерние действия могут иметь свою собственную анимацию, переопределяя метод анимации, иначе у ребенка будет Родительская анимация.2)гибкость: не держите метод анимации внутри onCreate() Вы можете обеспечить гибкость дочерних действий, не сохраняя метод анимации внутри onCreate(Bundle bundle). Теперь деятельность может иметь гибкость, чтобы иметь родительскую анимацию или свою собственную анимацию или вообще без анимации.
Надеюсь, это поможет.
Счастливого обучения.'
Я нашел более простой способ решения @Гийома. Набор
ContentView
только вBaseActivity
и не устанавливайте его в действиях, которые его расширяют:public abstract class BaseActivity extends Activity { @Override public void onCreate(bundle) { super.onCreate(bundle); setContentView(activity_main); } } public class Activity1 extends BaseActivity { @Override public void onCreate(bundle) { super.onCreate(bundle); // setContentView(activity_activity1) // Do NOT call this. } }