Android как создать свою собственную деятельность и расширить ее?

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

public BaseActivity расширяет действие {....}

public SubActivity расширяет BaseActivity {...}

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

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

Ответ 1

Чего именно вы пытаетесь достичь? Имеете ли два разных действия с общим 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;
    }
}

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Таким образом, код будет выглядеть так:

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

Действия детей

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

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

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

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

`