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

时间:2016-07-08 11:39:18

标签: android android-studio android-toolbar

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

如果我想要一个菜单​​选项来执行特定的功能,我自然会创建一个函数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);
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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);
  }
}

因此,您可以将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

   }

}

答案 2 :(得分:0)

如果你的foo()函数只有逻辑而没有视图逻辑,那么最好将它保存在静态类中。它会更快并且可以单元测试。如果它具有视图逻辑而不是使用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(this);