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;
    }
}