Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用接口在所有活动上实现代码_Java_Android - Fatal编程技术网

Java 使用接口在所有活动上实现代码

Java 使用接口在所有活动上实现代码,java,android,Java,Android,我试图在每个活动中实现一些代码,不想将代码复制到每个活动中 最初我只是有一个带有代码的父活动,然后扩展了所有其他活动,但我无法在ListActivities或ExpandableListActivities上执行此操作 我认为这将通过使用接口类来完成,然后让每个活动实现这一点。但是,当我尝试执行此操作时,Eclipse给了我一个错误,并说要删除方法体 这是我到目前为止所拥有的 import android.content.Intent; import android.view.Menu; imp

我试图在每个活动中实现一些代码,不想将代码复制到每个活动中

最初我只是有一个带有代码的父活动,然后扩展了所有其他活动,但我无法在ListActivities或ExpandableListActivities上执行此操作

我认为这将通过使用接口类来完成,然后让每个活动实现这一点。但是,当我尝试执行此操作时,Eclipse给了我一个错误,并说要删除方法体

这是我到目前为止所拥有的

import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public interface MenuOptions {

  /**
     * Method called when the hardware menu button is called. Uses optionmenu.xml for layout
     */
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.optionmenu, menu);
        return true;
    }

    /**
     * Event listener for the options menu. If home is pressed user is sent to home screen. If settings is pressed user is sent to setting screen
     * User is passed as an extra
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent nextIntent = null;

        switch (item.getItemId()) {
            case R.id.home:     
                        Toast.makeText(this, "You pressed the icon!", Toast.LENGTH_LONG).show();
                        nextIntent = new Intent(this, Home.class);

                      break;
            case R.id.settings:     
                        Toast.makeText(this, "You pressed the text!", Toast.LENGTH_LONG).show();
                        nextIntent = new Intent(this, Settings.class);
                      break;

        }

        nextIntent.putExtra("user", user);
        startActivity(nextIntent);
        return true;
    }

}

接口
Java中的类应该只包含方法签名,而不包含实现。因此,您必须创建一个基类:

public class MenuOptions extends Activity {
  /**
     * Method called when the hardware menu button is called. Uses optionmenu.xml for layout
     */
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.optionmenu, menu);
        return true;
    }

    /**
     * Event listener for the options menu. If home is pressed user is sent to home screen. If settings is pressed user is sent to setting screen
     * User is passed as an extra
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent nextIntent = null;

        switch (item.getItemId()) {
            case R.id.home:     
                        Toast.makeText(this, "You pressed the icon!", Toast.LENGTH_LONG).show();
                        nextIntent = new Intent(this, Home.class);

                      break;
            case R.id.settings:     
                        Toast.makeText(this, "You pressed the text!", Toast.LENGTH_LONG).show();
                        nextIntent = new Intent(this, Settings.class);
                      break;

        }

        nextIntent.putExtra("user", user);
        startActivity(nextIntent);
        return true;
    }
}
以及您的活动:

public class YourActivity extends MenuOptions {
/*...*/
}

接口不允许有方法体。这是因为它描述的是对象的接口,而不是方法本身


所有活动共享相同菜单选项的问题很常见。最简单的处理方法是定义2或3个超类(用于ListActivities和MapActivities)。

据我所知,接口只描述实现接口的类必须支持的方法。 这就是实现接口和扩展类之间的区别。 -因此,您不能编写所有类都使用的接口,只能定义一组方法,这些方法必须由实现该接口的任何类定义

我想说,你最好的办法是创建一个新类,它可以被你的所有活动用来做同样的工作。然后,您将需要该类的一个实例,该实例由每个activity onCreate(或其他地方)创建和初始化

或者,您可能会发现,您可以将新类设置为静态,这样就不需要创建实例,只需在适当的时间调用静态方法即可


另一种方法是创建一个包含标准行为的活动子类,并将您的所有活动创建为该活动的子类。如果您有ListActivities(例如),您必须进行一些重新编码,使它们成为包含列表的子类活动

好问题,我很想知道有趣的答案。您好,感谢您的回答,但此解决方案仍然意味着我有三个活动,它们的活动代码几乎完全相同,ListActivities和ExplableListActivities。您好,谢谢您的回复。看起来这可能是答案,只是感觉很笨重。