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