gpt4 book ai didi

java - 获取 NPE(已编辑)

转载 作者:行者123 更新时间:2023-12-01 04:47:28 24 4
gpt4 key购买 nike

我仍然收到 NPE,但现在它来 self 的 onCreate()。当我删除按钮时,一切正常。

以下是 XML(每个表行都来自单独的 XML):

<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp" >

<Button
android:id="@+id/doneP1"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="Done" />

<Button
android:id="@+id/resetP1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reset" />

</TableRow>

<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp" >

<Button
android:id="@+id/doneP2"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="Done" />

<Button
android:id="@+id/resetP2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reset" />

</TableRow>

代码如下:

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

/*doneP1 = (Button) this.findViewById(R.id.doneP1);
doneP2 = (Button) this.findViewById(R.id.doneP2);
resetP1 = (Button) this.findViewById(R.id.resetP1);
resetP2 = (Button) this.findViewById(R.id.resetP2);

checkTurn(); //starts the game

//buttons
doneP1.setOnClickListener(this);
doneP2.setOnClickListener(this);
resetP1.setOnClickListener(this);
resetP2.setOnClickListener(this);*/ //commented out
}

以及 onCreate 之外

@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.doneP1:
checkTurn();
break;
case R.id.doneP2:
checkTurn();
break;
case R.id.resetP1:
break;
case R.id.resetP2:
break;
}
}

这里是支票

public void checkTurn()
{
if(turn == 1)
{
changeLayout(turn);
turn = 2;
}
else
{
changeLayout(turn);
turn = 1;
}
}

这是更改布局(编辑:新的更改布局,我刚刚重新初始化了方法内的每个按钮,但仍然没有效果,我这样做对吗?)

public void changeLayout(int turn)
{
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
FragmentTransaction ft;

if(turn == 1) //if its player 1's turn
{
doneP1 = (Button) this.findViewById(R.id.doneP1);
resetP1 = (Button) this.findViewById(R.id.resetP1);
doneP1.setOnClickListener(this);
resetP1.setOnClickListener(this);
if(fragment == null) //checks wether the current framelayout contains a fragment or not
{
ft = fm.beginTransaction();
ft.add(R.id.fragment_container, new PlayerTurn1());
ft.commit();
//setPlayer1();
}
else
{
ft = fm.beginTransaction();
ft.replace(R.id.fragment_container, new PlayerTurn1());
ft.commit();

}
}
else
{
doneP2 = (Button) this.findViewById(R.id.doneP2);
resetP2 = (Button) this.findViewById(R.id.resetP2);
doneP2.setOnClickListener(this);
resetP2.setOnClickListener(this);
if(fragment == null)
{
ft = fm.beginTransaction();;
ft.add(R.id.fragment_container, new PlayerTurn2());
ft.commit();
//setPlayer2();
}
else
{
ft = fm.beginTransaction();;
ft.replace(R.id.fragment_container, new PlayerTurn2());
ft.commit();
}
}
}

这是日志猫

03-24 07:51:55.954: E/AndroidRuntime(5092): Caused by: java.lang.NullPointerException 03-24 07:51:55.954: E/AndroidRuntime(5092): at As2.packageTK.TicTacToeGame.onCreate(TicTacToeGame.java:88)

第 88 行是:

doneP1.setOnClickListener(this);

我已经为此工作了大约 4 个小时,但仍然无法解决一个简单的问题。我的头在流口水,我真的很累,我想在 sleep 前解决这个问题,所以我将不胜感激。我清理并重建了我的问题......什么都没有。一切看起来都很好,但事实并非如此……NPE 总是要闯进来。

最佳答案

看起来您正在 onCreate 中获取这些 View :

  doneP1 = (Button) this.findViewById(R.id.doneP1);
doneP2 = (Button) this.findViewById(R.id.doneP2);
resetP1 = (Button) this.findViewById(R.id.resetP1);
resetP2 = (Button) this.findViewById(R.id.resetP2);

但是在您更改转弯并更改布局后:

public void checkTurn()
{
if(turn == 1)
{
changeLayout(turn);
turn = 2;
}
else
{
changeLayout(turn);
turn = 1;
}
}

并运行:

ft.replace(R.id.fragment_container, new PlayerTurn1());

您基本上失去了对这些 View 的引用。因为已经不存在了。它们被另一个 fragment 的 View 所取代。

编辑:

另一种方法是在布局文件中设置 onClick 属性:

设置“android:onClick=”onDoneButtonOnClick”

并在您的 Activity 中创建方法:

public void onDoneButtonOnClick (View v)
{
// do here what every you want with this button.
}

在这种情况下,您必须从 Activity 中删除 onClickListener 的实现。

关于java - 获取 NPE(已编辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15596398/

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