从另一个类调用方法会导致应用崩溃

时间:2017-12-12 06:57:24

标签: android

我决定尝试使我的代码更加面向对象,避免在另一个类中重复代码。

活动的源代码:

     public class EasyMode extends MainActivity {

            GameActivityPVP game = new GameActivityPVP();

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.game_layout_pvp);

                game.initializeButtons();
            }
        }


    public class GameActivityPVP extends MainActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.game_layout_pvp);

            initializeButtons();
        }

        public void initializeButtons() {

            button[0] = (Button) findViewById(R.id.button1);
        }
}

第二个程序到达我尝试使用game.methodName();程序崩溃的方法调用的行。没有编译错误或任何东西。 我是一般的编程新手,所以请放轻松,我尽可能地简化我的代码。

Android监视器/ logcat:

W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...

W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView

3 个答案:

答案 0 :(得分:2)

您可以通过创建父类的对象来使用另一个类的方法。

见下面的例子;

在这里,您想要使用来自' GameActivityPVP'的方法。类。因此,您只需要在此类中创建一个对象。

  public class GameActivityPVP extends MainActivity {

        public static GameActivityPVP mGameActivity;

        public GameActivityPVP getInstance(){
             return mGameActivity; // assign value in onCreate() method.
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.game_layout_pvp);

                mGameActivity = this; // Do not forget this, otherwise you'll get Exception here.
                initializeButtons();
            }

            public void initializeButtons() {

                button[0] = (Button) findViewById(R.id.button1);
            }
    }

现在在另一个类中使用此对象' EasyMode'像这样;

if(GameActivityPVP.getInstance()!=null){
    GameActivityPVP.getInstance().initializeButtons();
}

答案 1 :(得分:0)

试试这个:

制作一个类实用程序:

在Utils中:

public class Utils{
private Activity context;
Button button;
public Utils(Activity context) {
    this.context=context;

}

public void inititializeButton(Activity context){
    button[0]= (Button) context.findViewById(R.id.button_flasher);
}

}

在你的班级使用中:

 public class EasyMode extends MainActivity {

        Utils utils;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.game_layout_pvp);
            utils=new Utils(this);
            utils.initializeButtons();
        }
    }

答案 2 :(得分:0)

如前所述,您不应该使用嵌套活动,它们不应该像这样进行交互。如果您想要两个活动进行交互,则必须通过意图来完成。关于重复的代码,您提供的解决方案很少,但我个人的意见是不遵循OOP规则。如果我必须编写那个逻辑,我会创建一个BaseActivity来保存其他两个活动的通用逻辑,并使用inheritance来扩展它们。

public class BaseActivity extends Activity {
    protected List<Button> buttons = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_layout_pvp);

        initializeButtons();
    }

    protected void initializeButtons() {

        buttons.add((Button) findViewById(R.id.button1));
    }
}

public class EasyMode extends BaseActivity {
    // Add here logic that is used only in EasyMode activity
}

public class GameActivityPVP extends BaseActivity {
    // Add here logic that is used only in GameActivityPVP activity
}

请注意,这样您就不必再次覆盖onCreate来初始化按钮等等。另外,我看到你为这两个活动使用了相同的布局,但是如果你想使用不同的布局,你可以像往常一样,然后调用initializeButtons