1

这似乎应该很容易,所以我一定遗漏了一些明显的东西:我在同一个包 us.glenedwards.myPackage 中有 4 个独立应用程序,

  • myClass1 扩展应用程序
  • myClass2 扩展应用程序

ETC...

我需要每个类都充当自己的独立应用程序。然而,我希望能够通过单击链接从我所在的课程开始其他 3 个课程。Android 允许我使用 Intents 来做到这一点:

Intent intent = new Intent(this, EditData.class);
overridePendingTransition(R.layout.edit_data_scrollview, R.layout.state);
startActivity(intent);

我尝试使用从 myClass1 启动 myClass2

myClass2.launch("");

但我收到一个错误,“应用程序启动不能被多次调用”。我可以让它工作的唯一方法是如果我从 myClass2 中删除“扩展应用程序”和 start() 方法,这意味着 myClass2 不再是一个独立的应用程序。

如何从 myClass1 启动 myClass2、myClass3 或 myClass4,而这 4 个都是独立的应用程序?

4

3 回答 3

4

可以通过start(...)直接调用其中一个Application子类的新实例来完成这项工作,但这有点像 hack,并且与该start(...)方法的预期用途相反。(只是语义上:在一个被调用start的类中调用的方法Application应该在你的应用程序启动时执行,而不是在它已经运行之后的某个任意点。)

您应该真正将方法视为传统 Java 应用程序中start方法的替代品。main如果你有一个应用程序调用另一个应用程序的main方法,你会(希望)得出你的结构不正确的结论。

因此,我建议重构您的设计,以便您的各个组件不是应用程序子类,而只是普通的旧常规类:

public class FirstModule {

    // can be any Parent subclass:
    private BorderPane view ;

    public FirstModule() {

        // create view; you could also just load some FXML if you use FXML
        view = new BorderPane();

        // configure view, populate with controls, etc...

    }

    public Parent getView() {
        return view ;
    }

    // other methods as needed...
}

同样,

public class SecondModule {

    private GridPane view ;

    public SecondModule {

        view = new GridPane();
        // etc etc
    }

    public Parent getView() {
        return view ;
    }
}

现在你可以做类似的事情

FirstModule firstModule = new FirstModule();
Scene scene = new Scene(firstModule.getView());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();

任何你需要做的地方。因此,您可以为每个模块创建独立的应用程序:

public class FirstApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new FirstModule().getView());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

或者您可以将它们实例化为更大应用程序的一部分:

public class CompositeModule {

    private HBox view ;

    public CompositeModule() {

        Button first = new Button("First Module");
        first.setOnAction(e -> {
            Parent view = new FirstModule().getView();
            Scene scene = new Scene(view);
            Stage stage = new Stage();
            stage.initOwner(first.getScene().getWindow());
            stage.setScene(scene);
            stage.show();
        });

        Button second = new Button("Second Module");
        second.setOnAction(e -> {
            Parent view = new SecondModule().getView();
            Scene scene = new Scene(view);
            Stage stage = new Stage();
            stage.initOwner(second.getScene().getWindow());
            stage.setScene(scene);
            stage.show();
        });

        HBox view = new HBox(10, first, second);
        view.setAlignment(Pos.CENTER);

    }

    public Parent getView() {
        return view ;
    }
}

public class CompositeApplication extends Application {
    @Override
    public void start(Stage primaryStage) {

        Scene scene = new Scene(new CompositeModule().getView(), 360, 150);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我的想法是,Application子类代表整个正在运行的应用程序。因此,每个 JVM 只实例化一次这样的类才有意义,因此您应该认为这些本质上是不可重用的。将您想要重用的任何代码移动到某个不同的类中。

于 2015-09-08T19:41:06.280 回答
0

我是对的; 这很简单。这就是我在 4 小时的睡眠中编写代码所得到的:

myClass2 class2 = new myClass2(); 
try { 
 class2.start(stage); 
} catch (Exception e) { e.printStackTrace(); } }
于 2015-09-08T18:41:39.383 回答
0

你试过这个吗?

Runtime.getRuntime().exec("myClass1 [args]"); //put all args as you used in command

此外,根据需要处理/捕获异常。

于 2015-09-08T18:25:16.747 回答