2012-01-11 58 views
61

我需要創建一個擴展Activity,做一些常見的任務在我的應用程序的基類,並從它致以活動,在下面的表格:android如何創建我自己的Activity並將其擴展?

公共BaseActivity延伸活動{} ....

公共子活動延伸BaseActivity {...}

子活動我需要給值以一些變量和UI組件中BaseActivity定義,我可能需要根據一些標誌值用於子活動定義不同的佈局,還(在子活動)欲執行的AsyncTask這是在BaseActivity中定義的。

這可能嗎?如果是的話,有沒有可能有幫助的教程? 預先感謝您

回答

127

究竟是你想達到什麼目的?除了一些變量或佈局的一部分,有兩個不同的活動與一個共同的用戶界面?

在這種情況下,我建議具有基部抽象活性,和兩個混凝土繼承子類。您可以在基本活動中定義所有常見行爲,併爲差異設置抽象方法,然後在實際實現中重寫。

例如,兩個活動,不同的佈局資源:

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 2012-01-11 15:09:34

+1

沒問題P)記住我在StackOverflow編輯器中很快編寫了代碼,可能會出現語法錯誤 – Guillaume 2012-01-11 19:43:50

+0

謝謝,我接受了這個想法並將它應用於其他函數,要傳遞的數據以及BaseActivity中的AsyncTask,它工作得很好。 – user173488 2012-01-12 07:23:10

5

是的,你可以,你應該牢記的基本繼承規則。您將繼承內部AsyncTask活動和BaseActivity中定義的屬性(如果您使其受到保護而不是私有)。從我現在看到的,我認爲你應該讓BaseActivity成爲一個抽象類,因爲只有subActivities的實例纔會被真正使用。

你應該只啓動並嘗試它,它會來的工作比你想象的更容易。如果您偶然發現任何問題,請詢問。

2

我已經找到了@ 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. 
    } 
} 
+1

似乎合法,但我有一些擔心,用戶將被留下來只使用一個佈局...如果我有3個共同的3差異活動的意見,但除了所有的佈局是不同的,那麼我想這個解決方案擊敗目的.... – Juni 2016-11-07 20:59:39

2

這個問題已經有了很好的答案。
我的答案是針對那些正在尋找一些實例的人。
以下是完整的工作 - >CODE

enter image description here
我們沒有做什麼新的東西,它就像任何其他的繼承方案(您想在多個地方的一些常見的行爲,但你要編寫行爲只有一次)。

優勢: 它確實提供了更好的代碼的可讀性,可維護性和嗒嗒blah.But不是這些-ibility後,如果你的大腦運行像羚羊,他們不會不管你的。
我們是在繼承的實權之後「CONTROL」。 (這也是現實生活中發生的事情。父母控制孩子:))。

在我的例子中,我有兩個活動MainActivity和OtherActivity。 兩種活動都有不同的佈局,但我希望他們都以一些動畫或一些歡迎消息開頭。

我們的第一個任務是找出共同的行爲。 here - >用動畫開始活動。
我們已經找到了常見的「東西」,現在我們將在BaseClass中編寫該行爲(AnimationActivity)。
MainActivity和OtherActivity將繼承AnimationActivity。

所以代碼看起來像`

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

兒童活動

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

這種設計方法提供了很多控制靈活性(改良力量)。

1)控制:保持動畫方法中的onCreate() 當你決定,活動應與動畫開始。 保持你的方法在onCreate(Bundle bundle)方法中。現在只需更改修飾符,您就可以控制子活動。
如果保留修飾符爲
final:子活動將從父動畫開始。
摘要:兒童活動將不得不給自己的動畫。
無修飾符:通過覆蓋動畫方法,小孩活動可以擁有自己的動畫,否則小孩將擁有父動畫。

2)靈活性:不要讓裏面的onCreate動畫()方法 你可以不守動畫方法中的onCreate(捆綁包)提供兒童活動的靈活性。 現在活動可以靈活地擁有自己的動畫或根本沒有動畫的父級動畫或 。
希望它有幫助。
快樂學習。

`