我决定尝试使我的代码更加面向对象,避免在另一个类中重复代码。
活动的源代码:
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
答案 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
。