gpt4 book ai didi

java - 尝试从同一布局获取或将按钮传递给自定义 SurfaceView

转载 作者:行者123 更新时间:2023-11-30 03:37:00 26 4
gpt4 key购买 nike

我正在创建一个小游戏我有一个 Activity :

GameActivity.java:

public class GameActivity extends Activity {

public static Button btnPause;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// requesting to turn the title OFF
requestWindowFeature(Window.FEATURE_NO_TITLE);
// making it full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.game_layout);
btnPause = (Button) findViewById(R.id.buttonPause);

}

@Override
public void onBackPressed() {
Toast.makeText(this,
"No effect, use the `||` button at top left of screen!",
Toast.LENGTH_SHORT).show();
}

}

上面的布局

game_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.spaceinvaders.game.GameSurfaceView
android:id="@+id/surfaceView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/buttonPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_pause"
android:textAppearance="?android:attr/textAppearanceLarge" >
</Button>

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_weight="1"
android:gravity="right"
android:text="@string/health"
android:textAppearance="?android:attr/textAppearanceLarge" />

<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="5dp"
android:minWidth="175dp" />
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_weight="1"
android:gravity="right"
android:text="@string/ammo"
android:textAppearance="?android:attr/textAppearanceLarge" />

<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="5dp"
android:minWidth="175dp" />
</LinearLayout>
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" >

<com.spaceinvaders.joystick.JoystickView
android:id="@+id/joystickView"
android:layout_width="100dp"
android:layout_height="100dp" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_weight="1" />

<Button
android:id="@+id/buttonShoot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:text="X"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

</FrameLayout>

您可能已经注意到,有一个自定义组件/SurfaceView,GameSurfaceView,它看起来也很相似:

GameSurfaceView.java:

public class GameSurfaceView extends SurfaceView implements
SurfaceHolder.Callback {

private GameLoop gameLoop;

private Bitmap background;
private Button btnPause;

public GameSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public GameSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs);
init();
}

public GameSurfaceView(Context context) {
super(context);
init();
}

private void init() {

btnPause = GameActivity.btnPause;
//causes NPE
btnPause.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
}
});

// adding the callback (this) to the surface holder to intercept events
getHolder().addCallback(this);

// create the game loop thread
gameLoop = new GameLoop(getHolder(), this);

// make the GamePanel focusable so it can handle events
setFocusable(true);
}
}

基本上,我试图将 game_layout.xml 中的按钮 buttonPause 传递到我的自定义 SurfaceView GameSurfaceView并添加一个 OnClickListener;使用静态变量但是我不断收到 NullPointerException

我可以在 GameActivity 类中轻松地做到这一点,但这对于射击等按钮来说会成为一个问题......

所以基本上我的问题是如何将 Button/component 从我的 GameActivity/game_layout 传递到 GameSurfaceView 包含在该 Activity 布局中的 game_layout.xml 类中。

我也尝试过在我的 GameSurfaceView 中使用 findViewById(R.id.buttonPause) 并添加产生相同结果的 OnClickListener结果(NPE)。

提前致谢

最佳答案

不是将 GameSurfaceView 放在 xml 中,而是动态添加 View 。通过这种方式,您可以在 GameSurfaceView 中拥有一个具有 Button 参数的构造函数。

关于java - 尝试从同一布局获取或将按钮传递给自定义 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com