2012-01-31 37 views
2

我認爲有一個解決方案來繼承問題,但我找不到它。在Java中繞過多繼承

我正在開發一個Android應用程序(目標是Android 2.1),它在大多數頁面上重複使用SlidingDrawer(用於我的菜單)。爲了避免在所有活動上初始化它,我創建了一個DefaultActivity來完成此操作。它運行良好,直到我不得不擴展TabActivity,因爲Java不支持多繼承。

基本上我有以下默認活動

public class DefaultActivity extends Activity{ 
    // Declarations 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Some code 
    } 

    @Override 
    protected void onPause() { 
     // Some code 
    } 

    protected void initializeMenu() { 
     // Init 
    } 
} 

現在,當我有一個活動我下面

public class SomeActivity extends DefaultActivity{ 
    // Declarations 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.myLayout); 
     super.initializeMenu(); 
    } 
} 

但是我有一個延伸的看法TabActivity,所以我不能做

public class SomeOtherActivity extends TabActivity, DefaultActivity 

我該怎麼做才能只有一個類來擴展,但哪些contai ns代碼爲ActivityTabActivity

謝謝。

+0

您定位的操作系統是什麼?這是通過使用OS 3 + – L7ColWinters 2012-01-31 15:09:43

+0

中的片段解決的,我針對的是Android 2.1。 – 2012-01-31 15:11:34

回答

3

我會用組成,而不是繼承的DefaultActivity。

創建一個ActivityHelper,它執行DefaultActivty所做的一切。那麼你的活動都有一個ActivityHelper類型的成員變量。

public class ActivityHelper { 
    // Declarations 

    @Override 
    public boolean onCreateOptionsMenu(Activity activity, Menu menu) { 
    // Some code 
    } 

    @Override 
    protected void onPause(activity) { 
    // Some code 
    } 

    protected void initializeMenu(activity) { 
    // Init 


    } 
} 

public class MyActivity extends Activity { 
    private final ActivityHelper helper; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    helper.onCreateOptionsMenu(this, menu) 
    } 

    @Override 
    protected void onPause() { 
    helper.onPause(this); 
    } 

    protected void initializeMenu() { 
    helper.initializeMenu(this) 
    } 
} 

這是一個更多的代碼,但更靈活。這隻有在您的DefaultActivity不依賴於Activity中的受保護方法時纔有效。

+0

謝謝,我想過做這樣的事情,但我找不到一個正確的方法來做到這一點! – 2012-02-01 08:20:43

1

將TabActivity作爲數據成員放置,而不是將其擴展,並將每個不想覆蓋的方法委託給它,其他人則實現自己。 這不會解決問題,難以置信,該方法駐留在DefaultActivity和TabActivity中(我猜這裏有一堆......)。 這就是爲什麼Java不允許多重繼承:)

希望它有幫助。

2

選項卡活動。

此課程已過時。 新應用程序應該使用Fragments而不是此類;要繼續在較舊的設備上運行,可以使用v4支持庫,該庫提供與DONUT兼容的Fragment API版本。

+0

是的,我知道標籤活動已被棄用,但我沒有使用標籤。我用按鈕模擬它的功能。我只是希望能夠不重新加載所有的活動,但只是在這個特定情況下的內容。我的問題是關於多重繼承,而不是應用程序本身的設計。 – 2012-01-31 15:16:53

+0

使用碎片... – L7ColWinters 2012-01-31 15:18:15

0

通常在一般的編程,我們做添加對象的字段使用多重繼承