2016-07-08 48 views
-3

比方說,我有兩個不同的活動,都使用相同的工具欄,使用相同的佈局和菜單選項。這部分是沒有問題的。在Android Studio中爲工具欄功能使用單獨的類?

如果我想要一個菜單​​選項來執行特定功能,我自然會創建一個函數foo(),並在選擇菜單選項時調用它。由於我在每個活動中分別處理了onOptionsItemSelected(MenuItem item)方法,因此使用帶有靜態「工具欄功能」的獨立類是一個好習慣嗎?例如。可以從任何活動的工具欄的下拉菜單訪問logout()函數。

然而,看起來很明顯,我找不到關於此事的任何「最佳實踐」。那麼處理多個活動調用相同的「工具欄功能」的最佳做法是什麼?

示例代碼:可以說MainActivitySecondActivity都具有相同的工具欄。在這兩種方法onCreate()

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

別的地方在兩個的活動還的:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.item_foo: 
      ToolbarFunctions.foo(); //Is this a good way to do it? 
     default: 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 
+0

是的..做吧.. !! –

+0

另一位認爲'android'和'android studio'之間沒有區別的人。 –

回答

0

好的做法是使用主要父活動類並擴展所有其他活動。這裏是你的父母活動的一些例子:

public abstract class MyParentActivity extends Activity { 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
} 

// This is your abstract function for other activity! 
public void foo(); 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.item_foo: 
      foo(); //Is this a good way to do it? Yes, here it's okey! 
     default: 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
    } 
} 

所以,你可以定義你10的活動,從MyParentActivity延伸如下代碼。這是所有:

public class MyOtherActivity extends MyParentActivity { 

    // Here your function will be called in every time 
    // when you click to Toolbar buttons! 
    // 
    // And you don't need write again about clicking menu! 

    @Ovveride 
    public void foo() { 

    //Any your behaviour 

    } 

} 
+0

不錯。所以我認爲如果我想讓我的一個活動在菜單中有一個額外的選項,那麼我會覆蓋'onOptionsItemSelected()'方法?或者我應該爲該活動創建一個單獨的工具欄? – blae

+0

@blae是的,比你可以重寫你想要的方法,特殊的行爲... – GensaGames

0

您可以定義BaseActivity類,並從BaseActivity延長所有其他活動。您將在BaseActivity中包含常用部分。

0

如果您FOO()函數只有邏輯,沒有視圖邏輯,則是更好地保持它在靜態class.It會更快和單元測試。如果它的視圖邏輯比BaseActivity示例。如果它有視圖和功能邏輯在一起可能最好是靜態的,並且還擴展了BaseActivity,它必須爲你的視圖更新實現一個接口和一個方法。你將傳遞給你的接口的靜態foo()方法將執行功能邏輯並且會返回界面到稱爲它的活動,讓活動更新自己的視圖。比你還可以單元測試你的foo()方法。

public interface FooInterface{ 
    void onFooDone(Foo foo); 
} 

public static void foo(FooInterface fooInterface){ 
calculate... 
    if(fooInterface!=null) 
    fooInterface.onFooDone(fooObject); 
} 

您的活動必須實現FooInterface 和調用foo(本);

相關問題