Android Java中的匿名内部类问题
我可以问一下,为什么在这种情况下我们必须使用匿名内部类,而不是传统的方式Android Java中的匿名内部类问题,android,Android,我可以问一下,为什么在这种情况下我们必须使用匿名内部类,而不是传统的方式 @Override public boolean OnCreateOptionsMenu(Menu menu) { MenuItem item = menu.add(R.string.external_url); item.setOnMenuItemClickListener(new MenuItemClickListener() { @Override public boo
@Override
public boolean OnCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(R.string.external_url);
item.setOnMenuItemClickListener(new MenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item){
String webpage = "http://developer.android.com/index.html";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webpage));
startActivity(intent);
return false;
}
});
return super.OnCreateOptionsMenu(menu);
}
你不必这样做,它只是倾向于更紧凑和简洁的方式。如果您愿意,您可以这样做:
@Override
public boolean OnCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(R.string.external_url);
item.setOnMenuItemClickListener(menuClickListener);
return super.OnCreateOptionsMenu(menu);
}
private MenuItemClickListener menuClickListener = new MenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item){
String webpage = "http://developer.android.com/index.html";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webpage));
startActivity(intent);
return false;
}
}
这仍然是一个匿名类,我只移动了它的声明并将其分配给一个私有成员变量。如果要在多个项目上设置它,这可能很有用
如果不希望匿名,可以创建一个内部类:
@Override
public boolean OnCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(R.string.external_url);
item.setOnMenuItemClickListener(new MyMenuClickListener());
return super.OnCreateOptionsMenu(menu);
}
private class MyMenuClickListener implements MenuItemClickListener {
@Override
public boolean onMenuItemClick(MenuItem item){
String webpage = "http://developer.android.com/index.html";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webpage));
startActivity(intent);
return false;
}
}
最后,您可以让您的活动/片段实现MenuItemClickListener
:
public class MyActivity extends Activity implements MenuItemClickListener {
/* ... */
@Override
public boolean OnCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(R.string.external_url);
item.setOnMenuItemClickListener(this);
return super.OnCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemClick(MenuItem item){
String webpage = "http://developer.android.com/index.html";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webpage));
startActivity(intent);
return false;
}
}
您可以创建一个MenuItemClickListener对象并覆盖onMenuItemclick,然后将其设置为MenuItem。我不确定我是否理解您的问题:在您的示例中,什么是不起作用的“常规方法”呢?不,如果您实现了活动,您将拥有item.setOnMenuItemClickListener(此);
public class MyActivity extends Activity implements MenuItemClickListener {
/* ... */
@Override
public boolean OnCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(R.string.external_url);
item.setOnMenuItemClickListener(this);
return super.OnCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemClick(MenuItem item){
String webpage = "http://developer.android.com/index.html";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(webpage));
startActivity(intent);
return false;
}
}