Android, как создать свою собственную активность и расширить ее? - PullRequest
66 голосов
/ 11 января 2012

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

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

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

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

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

Ответы [ 4 ]

135 голосов
/ 11 января 2012

Чего именно вы пытаетесь достичь? Наличие двух разных действий с общим пользовательским интерфейсом, за исключением некоторых переменных или частей макета?

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

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

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

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

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

5 голосов
/ 05 июля 2017

На этот вопрос уже есть очень хорошие ответы.
Тем не мение. мой ответ для тех людей, которые ищут какой-то рабочий пример.
Вот полный рабочий -> КОД

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

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

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

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

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

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

Детские занятия

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

Этот подход к проектированию обеспечивает большую гибкость Control и (POWER OF MODIFIER).

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

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

`

5 голосов
/ 11 января 2012

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

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

3 голосов
/ 17 февраля 2016

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