在Android Studio中传递变量给”View.OnClickListener”的问题

huangapple 未分类评论42阅读模式
英文:

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!

huangapple
  • 本文由 发表于 2020年4月5日 17:22:24
  • 转载请务必保留本文链接:https://java.coder-hub.com/61040447.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定