【问题标题】:Java onCreate with parameter like in initWithParameter c++Java onCreate 与 initWithParameter c++ 中的参数类似
【发布时间】:2011-04-22 17:28:21
【问题描述】:

可能太简单了,但我找不到正确的方法。

在 C++ 中,我可以编写 initWithParameter: xxx 来实例化一个类,然后在 init 中设置一些实例变量,并在初始化时给出值。

在 Java 中我不知道该怎么做。目前我做以下事情:

public class SpecialScreen extends BASEScreen{
private static final int ACTIVITY_1 = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); //create the instance
    defineScreenType (ACTIVITY_1); //second call to set the instance variable
    presentOnScreen();
}

在 BASEScreen 中时:

public class BASEScreen extends Activity {
private Integer activityCode; // which activity should I do?

@Override
public void onCreate(Bundle savedInstanceState) {  // the creation
    super.onCreate(savedInstanceState);
}

// the setting of the instance variable
public void defineScreenType(int screenID) {
    activityCode = screenID;

}

这不是最好的方法。如何更好地做到这一点?

谢谢

添加以在 BASEScreen 中显示 SpecialScreen 的调用:

    @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    Intent i;
    switch (item.getItemId()) {
    case OTHER_PAGE_ID:
        // 
        if (activityCode == ACTIVITY_1) {
            i = new Intent(this, SpecialScreen2.class);
            i.putExtra("Task", ACTIVITY_2);
            startActivityForResult(i, ACTIVITY_2);
            finish();

        } else {
            i = new Intent(this, SpecialScreen1.class);
            i.putExtra("Task", ACTIVITY_1);
            startActivityForResult(i, ACTIVITY_1);
            finish();
        }

        return true;

ps 我知道不再需要放置 Extra。这是我在拥有两个 SpecialScreen 子类并始终使用此参数调用 BASEScreen 之前的方式。

【问题讨论】:

  • 重新标记为一个 android 问题,看起来就是这样。
  • @user387184:你想做什么?像“用户按下按钮 1,开始活动 1”,“用户按下按钮 2,开始活动 2”之类的东西?根据用户选择或其他条件开始不同的活动?

标签: java android initialization oncreate


【解决方案1】:

正确,没有像 c++ 那样的“默认”语法。您必须在构造函数中执行此操作。请注意,您不需要使用 setter 方法,您可以将 activityCode 设为受保护而不是私有,然后执行以下操作:

activityCode = ACTIVITY_1;

另一个选项是使用构建器模式来构建您的对象,使用构建器内的一组默认值,您在请求构建对象时覆盖(在需要时)。

针对以下 cmets 进行编辑:

对于一些混淆,我深表歉意,因为我称它为“构造函数”,但实际上并非如此。

如果在BASEScreen 中,您将访问权限从private 更改为protected

public class BASEScreen extends Activity {
    protected Integer activityCode;

然后您可以在 SpecialScreen 子类中访问它:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activityCode = 1; // Or ACTIVITY_1 if you'd like
    presentOnScreen();
}

【讨论】:

  • 对不起,这里我也不确定 完全理解。我在哪里设置活动代码?我必须在 BASEScreen 内进行,对吗?所以我应该像上面 John Munsch 写的那样通过它?请解释...谢谢
  • 抱歉,请参阅上面的编辑。我没有对您的示例代码给予足够的关注,因为您没有直接调用构造函数。
【解决方案2】:

如果我正确理解了您的问题。 Java 中的任何类都可以有一个或多个构造函数。每个都可以没有参数或您传入的一组参数(尽管它们必须每个都具有唯一的集合/顺序,以便编译器可以判断您打算使用哪一个)。

public class SpecialScreen extends BASEScreen {
    private static final int ACTIVITY_1 = 1;

    // There is a default constructor with no parameters provided for you
    // by default if you don't define any constructors.
    public SpecialScreen() {
       // I'm overriding the default constructor and this one will do 
       // something else.
       super(ACTIVITY_1);
    }

    // But you can also have ones like this.
    public SpecialScreen(int activity) {
       super(activity);
    }
}

Each 在你执行一个新的时候被调用,例如:

BASEScreen porcupine = new SpecialScreen(); // 无参数构造函数。

BASEScreen porcupine = new SpecialScreen(5); // 接受参数的构造函数。

【讨论】:

  • 抱歉,不太明白。我为创建的对象设置的 activityCode 变量在哪里?创建的对象需要知道它实际上是哪种屏幕 - 我在这里缺少什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2020-02-03
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多