让我们说我有两个不同的活动,都使用相同的工具栏,使用相同的布局和菜单选项。这部分没问题。
如果我想要一个菜单选项来执行特定的功能,我自然会创建一个函数foo()
,并在选择菜单选项时调用它。因为我在每个活动中单独处理的onOptionsItemSelected(MenuItem item)
方法,使用具有静态“工具栏功能”的单独类是否是一个好习惯?例如。从任何活动的工具栏中的下拉菜单中访问logout()
功能。
但是,似乎很明显,我找不到任何关于此事的“最佳做法”。那么,处理调用相同“工具栏功能”的多个活动的最佳实践是什么?
示例代码:假设MainActivity
和SecondActivity
都有相同的工具栏。在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)
您可以定义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);