在 Android Studio 中使用单独的 class 工具栏功能?

Using a separate class for toolbar functions in Android Studio?

假设我有两个不同的活动,都使用相同的工具栏,使用相同的布局和菜单选项。这部分没问题。

如果我想要一个菜单​​选项来执行特定的功能,我自然会创建一个函数,foo(),并在选择菜单选项时调用它。因为我在每个活动中单独处理了 onOptionsItemSelected(MenuItem item) 方法,所以使用单独的 class 和静态 "toolbar functions" 是一个好习惯吗?例如。具有可从任何 activity.

工具栏的下拉菜单访问的 logout() 功能

这似乎很明显,但是,我找不到任何关于此事的 "best practices"。那么处理调用相同 "toolbar function" 的多个活动的最佳实践是什么?

示例代码:假设 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);
}

您可以定义一个 BaseActivity class 并从 BaseActivity 扩展所有其他活动。您可以在 BaseActivity 中包含公共部分。

最好的做法是使用 main parent activity class 并扩展所有其他活动。这是您的 parent Activity:

的一些示例
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 你的 activity 从 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

   }

}

如果您的 foo() 函数只有逻辑而没有视图逻辑,那么最好将其保持为静态 class.It 会更快并且可以进行单元测试。如果它有视图逻辑而不是使用 BaseActivity 示例。如果它同时具有视图和功能逻辑,最好是静态的并且还扩展 BaseActivity ,它必须为您的视图实现一个带有方法的接口 updates.That 接口,您将传递给您 static foo() 方法,它将执行功能逻辑并将 return 与 activity 的接口一起调用它,让 activity 更新它自己的视图。你仍然可以对你的 foo() 方法进行单元测试。

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

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

您的 activity 必须实现 FooInterface 并调用 foo(this);