英文:
Problem to pass variables in "View.OnClickListener" in Android Studio
问题
这是我的问题:我试图从onCreate方法传递变量到View.OnClickListener。例如,这是一个完美运行的活动(也是我的模板):
...
private View.OnClickListener btnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.b_player1:
if (player_actif == 1) {
// 点击处理
}
break;
case R.id.b_player2:
if (player_actif == 2) {
// 点击处理
}
break;
case R.id.b_player3:
if (player_actif == 3) {
// 点击处理
}
break;
case R.id.b_player4:
if (player_actif == 4) {
// 点击处理
}
break;
}
}
};
...
这段代码可以正常运行,我可以在onClick方法中正确地编辑jeuplayer1等ArrayList。现在,我尝试让以下代码工作:
...
private View.OnClickListener btn = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.p2:
// 点击处理
break;
case R.id.p3:
// 点击处理
break;
case R.id.p4:
// 点击处理
break;
}
}
};
...
不幸的是,这段代码无法正常工作(当您点击p2按钮时,应用程序会突然停止),并出现以下错误消息:错误消息。按钮p2被视为“null对象”... 请仔细阅读这两段代码,我知道这可能做得很糟糕,欢迎提供建议/修正。我真的需要您的帮助!
英文:
So here's my problem: I'm trying to pass variables from the onCreate method to a View.OnClickListener. Here is, for example, an activity that works perfectly (and serves as a model for me):
package com.thebigbadboy.bataille_corse;
import androidx.appcompat.app.AppCompatActivity;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;
import java.util.List;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ImageView card1, card2, card3, card4;
TextView cardsplayer1, cardsplayer2, cardsplayer3, cardsplayer4, compteur;
Button b_player1, b_player2, b_player3, b_player4;
private Random r;
float comparateur=0.0f;
byte melange=0, joueurs_tot=4;
int player_actif=0, a=0, cardnum1=0, cardnum2=0, cardnum3=0, cardnum4=0, count=0;
List<Byte> deck = new ArrayList();
List<Byte> jeuplayer1 = new ArrayList();
List<Byte> jeuplayer2 = new ArrayList();
List<Byte> jeuplayer3 = new ArrayList();
List<Byte> jeuplayer4 = new ArrayList();
List<Byte> jeuplateau = new ArrayList();
private View.OnClickListener btnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.b_player1 :
if (player_actif==1) {
player_actif++;
melange = jeuplayer1.get(0);
jeuplayer1.remove(0);
jeuplateau.add(melange);
cardsplayer1.setText(jeuplayer1.size() + " cartes");
melange = jeuplateau.get(jeuplateau.size()-1);
cardnum1 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card1.setImageResource(cardnum1);
if (jeuplateau.size()>1) {
melange = jeuplateau.get(jeuplateau.size()-2);
cardnum2 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card2.setImageResource(cardnum2);
}
if (jeuplateau.size()>2) {
melange = jeuplateau.get(jeuplateau.size()-3);
cardnum3 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card3.setImageResource(cardnum3);
}
if (jeuplateau.size()>3) {
melange = jeuplateau.get(jeuplateau.size()-4);
cardnum4 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card4.setImageResource(cardnum4);
}
}
break;
case R.id.b_player2 :
if (player_actif==2) {
player_actif++;
melange = jeuplayer2.get(0);
jeuplayer2.remove(0);
jeuplateau.add(melange);
cardsplayer2.setText(jeuplayer2.size() + " cartes");
melange = jeuplateau.get(jeuplateau.size()-1);
cardnum1 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card1.setImageResource(cardnum1);
if (jeuplateau.size()>1) {
melange = jeuplateau.get(jeuplateau.size()-2);
cardnum2 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card2.setImageResource(cardnum2);
}
if (jeuplateau.size()>2) {
melange = jeuplateau.get(jeuplateau.size()-3);
cardnum3 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card3.setImageResource(cardnum3);
}
if (jeuplateau.size()>3) {
melange = jeuplateau.get(jeuplateau.size()-4);
cardnum4 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card4.setImageResource(cardnum4);
}
}
break;
case R.id.b_player3 :
if (player_actif==3) {
player_actif++;
melange = jeuplayer3.get(0);
jeuplayer3.remove(0);
jeuplateau.add(melange);
cardsplayer3.setText(jeuplayer3.size() + " cartes");
melange = jeuplateau.get(jeuplateau.size()-1);
cardnum1 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card1.setImageResource(cardnum1);
if (jeuplateau.size()>1) {
melange = jeuplateau.get(jeuplateau.size()-2);
cardnum2 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card2.setImageResource(cardnum2);
}
if (jeuplateau.size()>2) {
melange = jeuplateau.get(jeuplateau.size()-3);
cardnum3 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card3.setImageResource(cardnum3);
}
if (jeuplateau.size()>3) {
melange = jeuplateau.get(jeuplateau.size()-4);
cardnum4 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card4.setImageResource(cardnum4);
}
}
break;
case R.id.b_player4 :
if (player_actif==4) {
player_actif=1;
melange = jeuplayer4.get(0);
jeuplayer4.remove(0);
jeuplateau.add(melange);
cardsplayer4.setText(jeuplayer4.size() + " cartes");
melange = jeuplateau.get(jeuplateau.size()-1);
cardnum1 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card1.setImageResource(cardnum1);
if (jeuplateau.size()>1) {
melange = jeuplateau.get(jeuplateau.size()-2);
cardnum2 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card2.setImageResource(cardnum2);
}
if (jeuplateau.size()>2) {
melange = jeuplateau.get(jeuplateau.size()-3);
cardnum3 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card3.setImageResource(cardnum3);
}
if (jeuplateau.size()>3) {
melange = jeuplateau.get(jeuplateau.size()-4);
cardnum4 = getResources().getIdentifier("c" + melange, "drawable", getPackageName());
card4.setImageResource(cardnum4);
}
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (byte i = 0; i < 52; i++) deck.add(i);
card1 = (ImageView) findViewById(R.id.card1);
card2 = (ImageView) findViewById(R.id.card2);
card3 = (ImageView) findViewById(R.id.card3);
card4 = (ImageView) findViewById(R.id.card4);
cardsplayer1 = (TextView) findViewById(R.id.cardsplayer1);
cardsplayer2 = (TextView) findViewById(R.id.cardsplayer2);
cardsplayer3 = (TextView) findViewById(R.id.cardsplayer3);
cardsplayer4 = (TextView) findViewById(R.id.cardsplayer4);
b_player1 = (Button) findViewById(R.id.b_player1);
b_player2 = (Button) findViewById(R.id.b_player2);
b_player3 = (Button) findViewById(R.id.b_player3);
b_player4 = (Button) findViewById(R.id.b_player4);
b_player1.setOnClickListener(btnClickListener);
b_player2.setOnClickListener(btnClickListener);
b_player3.setOnClickListener(btnClickListener);
b_player4.setOnClickListener(btnClickListener);
r = new Random();
player_actif=r.nextInt(3)+1;
for (byte i=0; i<52; i++) {
a = r.nextInt(52 - i);
melange = deck.get(a);
deck.remove(a);
if (i < 13) {
jeuplayer1.add(melange);
} else if (i < 26) {
jeuplayer2.add(melange);
} else if (i < 39) {
jeuplayer3.add(melange);
} else jeuplayer4.add(melange);
}
}
}
And that code works really perfectly, I can edit the Array List jeuplayer1 etc correctly in the Onclick method. Now I tried to make this works :
package com.retroverse.bataille_corse;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import
androidx.appcompat.app.AppCompatActivity;
public class Menu_play_local extends AppCompatActivity {
Button p1,p2,p3,p4;
StringBuilder s_p1,s_p2,s_p3,s_p4;
byte state_p2 = 1, state_p3 = 0, state_p4 = 0;
private View.OnClickListener btn = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.p2:
s_p2 = new StringBuilder()
state_p2++;
s_p2.append(getString(R.string.menu_loc_op2));
if (state_p2 == 3) {state_p2 = 1;}
if (state_p2 == 1) {s_p2.append(getString(R.string.bot));}
if (state_p2 == 2) {s_p2.append(getString(R.string.human));}
p2.setText(s_p2.toString());
break;
case R.id.p3:
s_p3.setLength(0);
state_p3++;
s_p3.append(R.string.menu_loc_op3);
if (state_p3 == 3) {state_p3 = 0;}
if (state_p3 == 0) {s_p3.append(getString(R.string.nobody));}
if (state_p3 == 1) {s_p3.append(getString(R.string.bot));}
if (state_p3 == 2) {s_p3.append(getString(R.string.human));}
p3.setText(s_p3.toString());
break;
case R.id.p4:
s_p4.setLength(0);
state_p4++;
s_p4.append(R.string.menu_loc_op4);
if (state_p4 == 3) {state_p4 = 0;}
if (state_p4 == 0) {s_p4.append(getString(R.string.nobody));}
if (state_p4 == 1) {s_p4.append(getString(R.string.bot));}
if (state_p4 == 2) {s_p4.append(getString(R.string.human));}
p4.setText(s_p4.toString());
break;
}
}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_play_local);
Button p1 = findViewById(R.id.p1);
Button p2 = findViewById(R.id.p2);
Button p3 = findViewById(R.id.p3);
Button p4 = findViewById(R.id.p4);
p2.setOnClickListener(btn);
p3.setOnClickListener(btn);
p4.setOnClickListener(btn);
StringBuilder s_p1 = new StringBuilder().append(getString(R.string.menu_loc_op1)).append(getString(R.string.human));
StringBuilder s_p2 = new StringBuilder().append(getString(R.string.menu_loc_op2)).append(getString(R.string.bot));
StringBuilder s_p3 = new StringBuilder().append(getString(R.string.menu_loc_op3)).append(getString(R.string.nobody));
StringBuilder s_p4 = new StringBuilder().append(getString(R.string.menu_loc_op4)).append(getString(R.string.nobody));
p1.setText(s_p1.toString());
p2.setText(s_p2.toString());
p3.setText(s_p3.toString());
p4.setText(s_p4.toString());
}
}
And unfortunately, this code doesn't work properly (this is normal if there is no code when you touch the p1 button): when you touch the p2 button, the application stops abruptly and here is the error message :error message
The button p2 is considered like a "null object"... Please read carefully the 2 codes, I know it can be very badly done, feel free to advise / correct me. I really need your help please!
专注分享java语言的经验与见解,让所有开发者获益!
评论