2012-01-11 3 views
61

мне нужно создать базовый класс, который расширяет Activity, который делает некоторые общие задачи в моем приложении и продлить свои мероприятий с от него, в следующем виде:android Как создать свою собственную деятельность и расширить ее?

общественный BaseActivity расширяет активность {....}

общественного SubActivity расширяет BaseActivity {...}

в SubActivity мне нужно дать значения для некоторых переменных и компонентов пользовательского интерфейса, определенных в BaseActivity, я, возможно, потребуется, чтобы определить другой макет для SubActivity в соответствии с некоторым значением флага, а также (в SubActivity) Я хочу, чтобы выполнить AsyncTask который определен в BaseActivity.

это возможно? если да, есть ли какой-нибудь учебник, который может помочь? заблаговременно

ответ

127

Что именно вы пытаетесь достичь? Имеете ли два разных действия с общим ui, за исключением некоторых переменных или частей макета?

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

Например, для двух видов деятельности с различными ресурсами компоновочными:

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; 
    } 
} 

Вы можете иметь много более абстрактные методы, для каждого бита вы хотите специфичным для ваших подклассов.

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

+0

спасибо большое, это именно то, что мне нужно. – user173488

+1

Нет проблем P) Помните, что я быстро закодировал в редакторе StackOverflow, могут быть синтаксические ошибки – Guillaume

+0

спасибо, я взял идею и применил ее к другим функциям, данным для передачи и AsyncTask в BaseActivity, это сработало отлично. – user173488

5

Да, вы можете просто иметь в виду основные правила наследования. Вы наследуете внутреннюю активность AsyncTask и свойства, определенные в BaseActivity, если вы сделаете их защищенными, а не частными. Из того, что я вижу сейчас, я думаю, что вы должны сделать BaseActivity абстрактным классом, так как будут использоваться только экземпляры subActivities.

Вы должны только начать и попробовать, это придет и будет работать легче, чем вы думаете. Если вы наткнетесь на какие-либо проблемы, просто спросите.

2

Я нашел более простой способ решения @ Гийома. Установите 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. 
    } 
} 
+1

кажутся законными, но у меня есть некоторые проблемы, у пользователя останется только один макет ... если у меня есть 3 вида, общие в 3-х действиях diff, но кроме этого все макеты разные, я думаю, это решение побеждает цель.... – Juni

2

Этот вопрос уже есть очень хорошие ответы.
Мой ответ для тех людей, которые ищут какой-то рабочий пример.
Вот полный рабочий ->CODE

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

ПРЕИМУЩЕСТВО: Это обеспечит улучшение читабельности кода, ремонтопригодность и бла blah.But не после того, как эти -ibility, они не важны для вас, если ваш мозг работает, как серна.
Мы находимся после реальной власти наследования «КОНТРОЛЬ». (Это то, что происходит и в реальной жизни. Родитель контролирует ребенка :)).

В моем примере у меня есть две активности MainActivity и OtherActivity. Обе операции имеют разный макет, но я хочу, чтобы они оба начали с некоторой анимации или какого-то приветственного сообщения.

Наша первая задача - выяснить общее поведение. здесь -> Начало деятельности с анимацией.
Мы нашли общую «вещь», теперь мы будем писать это поведение в BaseClass (AnimationActivity).
MainActivity и OtherActivity унаследуют AnimationActivity.

Так код будет выглядеть `

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

детьми Развлечения

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

Этот дизайнерский подход дает много от Управление и Гибкость (МОЩНОСТЬ МОДИФИКАЦИИ).

1) КОНТРОЛЬ: Сохранение метода анимации внутри onCreate() Когда вы решите, что действия должны начинаться с анимации. Храните свой метод внутри метода onCreate (Bundle bundle). Теперь просто изменив модификатор, вы можете контролировать дочерние действия.
Если вы сохраняете модификатор как
final: Действия ребенка начнутся с родительской анимации.
аннотация: Ребенок должен будет дать свою собственную анимацию.
без модификатора: дочерние действия могут иметь собственную анимацию путем переопределения метода анимации, иначе у ребенка будет родительская анимация.

2) Гибкость: Не держите метод анимации внутри OnCreate() Вы можете обеспечить ребенка деятельности гибкость, не сохраняя метод анимации в OnCreate (Bundle Bundle). Теперь действия могут иметь гибкость, чтобы иметь родительскую анимацию или их собственную анимацию или вообще не анимацию.
Надеюсь, это поможет.
Счастливое обучение.

`

Смежные вопросы