Java Android重构菜单类
我有一个android应用程序的菜单类,我觉得我可以重构它,因为我有4次几乎相同的方法,请参见下面:Java Android重构菜单类,java,android,Java,Android,我有一个android应用程序的菜单类,我觉得我可以重构它,因为我有4次几乎相同的方法,请参见下面: public abstract class MenuActivity extends SherlockActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar ab = getSherlock().getActionBar
public abstract class MenuActivity extends SherlockActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar ab = getSherlock().getActionBar();
SherlockHelper.setupActionBar(ab, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return createMenu(this, menu);
}
public static boolean createMenu(SherlockActivity aActivity, Menu menu){
MenuInflater inflater = ((SherlockActivity) aActivity).getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent((Context) aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent((Context) aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent((Context) aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent((Context) aActivity, SavedResultsActivity.class));
return true;
}
public static boolean createMenu(SherlockListActivity aActivity, Menu menu){
MenuInflater inflater = aActivity.getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent(aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent(aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent(aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent(aActivity, SavedResultsActivity.class));
return true;
}
public static boolean createMenu(SherlockFragmentActivity aActivity, Menu menu){
MenuInflater inflater = aActivity.getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent(aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent(aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent(aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent(aActivity, SavedResultsActivity.class));
return true;
}
public static boolean createMenu(SherlockFragment aActivity, Menu menu){
MenuInflater inflater = aActivity.getSherlockActivity().getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity.getSherlockActivity(), InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent(aActivity.getSherlockActivity(), LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent(aActivity.getSherlockActivity(), ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent(aActivity.getSherlockActivity(), MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent(aActivity.getSherlockActivity(), SavedResultsActivity.class));
return true;
}
}
我想改变这个,所以我只有一个方法,而不是四个!为此,我假设传入一个泛型对象,但实际上我不知道传入什么!我是否需要将方法更改为动态方法而不是静态方法
在此方面的任何帮助都将不胜感激。非常感谢您只需要
上下文
就可以在所有方法的主体中创建所需的内容
在一个以Context
为参数的方法中提取相同的comde,以便可以根据需要多次调用此方法
public static boolean createMenu(Context context, Menu menu) {
// Here is your code that use context
}
public static boolean whateverMethodYouWant(WhatEverClass smth, Menu menu) {
// Get/cast or smth else to get Context from smth.
Context context = castOrExtractContext(smth);
return createMenu(context, menu);
}
在本例中,它是无错误代码,因为您处理用户传递给您的任何类的所有内容,而他不知道您在方法中执行了什么。好的,因为您有两种不同的答案,我可以告诉您区别以及何时使用 首先,当您有多个方法要组合成一个方法时,您要做的是找到一个公共分母。也就是说,所有方法都有共同点 要找到公分母,请检查要转换为公分母的方法
public static boolean createMenu(SherlockActivity aActivity, Menu menu){
MenuInflater inflater = ((SherlockActivity) aActivity).getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent((Context) aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent((Context) aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent((Context) aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent((Context) aActivity, SavedResultsActivity.class));
return true;
}
通过该方法,有两个对象是通过参数创建的菜单充气机和(上下文)A活动。MenuInflater是从活动中的方法访问的,而上下文是从活动强制转换的。因此,为您的新(组合)方法提供一个活动将为新方法提供足够的信息,使其能够完成其他四个方法所做的事情
当您找到公分母时,有两种情况:
public static boolean createMenu(Activity aActivity, Menu menu){
MenuInflater inflater = aActivity.getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent((Context) aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent((Context) aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent((Context) aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent((Context) aActivity, SavedResultsActivity.class));
return true;
}
现在其他四个方法可以调用这个
public static boolean createMenu(SherlockActivity aActivity, Menu menu){
return createMenu((Activity) aActivity, menu); // Explicitly call method with Activity as argument
}
public static boolean createMenu(SherlockListActivity aActivity, Menu menu){
return createMenu((Activity) aActivity, menu); // Explicitly call method with Activity as argument
}
public static boolean createMenu(SherlockFragmentActivity aActivity, Menu menu){
return createMenu((Activity) aActivity, menu); // Explicitly call method with Activity as argument
}
public static boolean createMenu(SherlockFragment aActivity, Menu menu){
return createMenu(aActivity.getSherlockActivity(), menu); // Explicitly call method with Activity as argument
}
第二种情况的解决方案:
假设这四个类不是全部都扩展活动,也不是全部都可以转换为上下文。然后,我们需要一种方法来告诉新方法如何从我们提供的类访问活动和上下文。为此,我们使用一个接口。接口有许多方法,它们明确地告诉实现该接口的类可以提供接口承诺的信息(当然,只要类实现是正确的)
现在,让所有类实现这个接口类如何实现接口方法取决于它们,但它们必须提供这些方法
您的新方法知道它可以使用Sherlock接口(因为它提供了一个活动)
由于您的所有类都实现了该接口,因此java将调用该方法,并且您只有一个方法,而不是四个
希望这个解释有帮助 你能给我举个例子吗?我想我知道你的意思,在我的方法中做一些类似于
publicstaticbooleancreatemenu(上下文上下文,菜单菜单)
?如果你确定所有类都实现了你的接口,你甚至不需要最后4个方法,在这种情况下你只需要在参数中传递接口。
public interface SherlockInterface {
public Activity getActivity();
}
public static boolean createMenu(SherlockInterface iface, Menu menu){
Activity aActivity = iface.getActivity();
MenuInflater inflater = aActivity.getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
Intent i = new Intent((Context) aActivity, InstructionsActivity.class);
i.putExtra("Flag", "firstInstructions");
menu.findItem(R.id.hearing_test).setIntent(i);
menu.findItem(R.id.learn).setIntent(new Intent((Context) aActivity, LearnActivity.class));
menu.findItem(R.id.share).setIntent(new Intent((Context) aActivity, ShareActivity.class));
menu.findItem(R.id.locate).setIntent(new Intent((Context) aActivity, MapActivity.class));
menu.findItem(R.id.saved).setIntent(new Intent((Context) aActivity, SavedResultsActivity.class));
return true;
}