Не срабатывает метод в частном случае. Почему?

код логики

    package com.example.sow;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Random;

import static android.graphics.Color.*;

public class AstralBattle extends AppCompatActivity {

    private int currentApiVersion;
    public static final String pName = "pName";
    public static final String gameComplexity = "Complexity";

    String
            flag,
            temp,
            level_num,
            flagComplexity;


    SharedPreferences
            gameSetting,
            sPrefGameComplexity;

    int     hpnm, hpn, player_atk,
            player_str, player_agi,
            player_sta, player_lvl,
            player_cDmg, player_exp,
            player_eva, player_def,
            hen, exp, exp_get, counts;
    boolean
            motion = true,
            player_cDmg_status;

    @RequiresApi(api = Build.VERSION_CODES.O)
    @SuppressLint({"WrongConstant", "ShowToast", "SetTextI18n"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        currentApiVersion = android.os.Build.VERSION.SDK_INT;
        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        if (currentApiVersion >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().setSystemUiVisibility(flags);
            final View decorView = getWindow().getDecorView();
            decorView.setOnSystemUiVisibilityChangeListener
                    (visibility -> {
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            decorView.setSystemUiVisibility(flags);
                        }
                    });
        }
        setContentView(R.layout.activity_astralbattle);
        waitDialog md = new waitDialog(this);
        TextView player_name = findViewById(R.id.player_name);
        TextView creep_name = findViewById(R.id.creep_name);
        LinearLayout memo = findViewById(R.id.memo);
        EditText listener_flag = findViewById(R.id.listener_flag);
        ArrayList<String> list_hp = new ArrayList<>();
        ArrayList<String> list_name = new ArrayList<>();
        try {
            XmlPullParser parser = getResources().getXml(R.xml.astral_creeps);
            while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {
                if (parser.getEventType() == XmlPullParser.START_TAG
                        && parser.getName().equals("creep")) {
                    list_name.add(parser.getAttributeValue(0));
                    list_hp.add(parser.getAttributeValue(1));
                }
                parser.next();
            }
        }
        catch (Throwable t) {
            Toast.makeText(this,
                    "Ошибка при загрузке XML-документа: " + t.toString(), Toast.LENGTH_LONG)
                    .show();
        }
        showWait(getCurrentFocus(), md);
        ProgressBar health_player_line = findViewById(R.id.health_player_line);
        ProgressBar health_enemy_line = findViewById(R.id.health_enemy_line);
        TextView health_player_num = findViewById(R.id.health_player_num);
        TextView health_enemy_num = findViewById(R.id.health_enemy_num);
        TextView motion_check = findViewById(R.id.motion);
        TextView level = findViewById(R.id.level);
        gameSetting = getSharedPreferences(pName, MODE_PRIVATE);
        flag = gameSetting.getString(pName, "none");
        sPrefGameComplexity = getSharedPreferences(gameComplexity, MODE_PRIVATE);
        flagComplexity = sPrefGameComplexity.getString(gameComplexity, "unknown");

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @SuppressLint("SetTextI18n")
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                HashMap<String, String> player_health_max = new HashMap<>();
                for (DataSnapshot dss: snapshot
                        .child("Players")
                        .child(flag)
                        .child("Stats")
                        .getChildren()) {
                    player_health_max.put(dss.getKey(),
                            Objects.requireNonNull(dss.getValue()).toString());
                }
                for(Map.Entry<String, String> entry: player_health_max.entrySet()) {

                    String key = entry.getKey();
                    String value = entry.getValue();

                    if(key.equals("Damage")) {
                        player_atk = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Strength")) {
                        player_str = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Agility")) {
                        player_agi = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Stamina")) {
                        player_sta = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Defence")) {
                        player_def = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("criticalDamage")) {
                        player_cDmg = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Experience")) {
                        player_exp = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Evasion")) {
                        player_eva = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("HealthMax")) {
                        hpnm = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("Experience")) {
                        exp = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                }
                HashMap<String, String> player_health = new HashMap<>();
                for (DataSnapshot dss: snapshot
                        .child("Players")
                        .child(flag)
                        .child("Player")
                        .getChildren()) {
                    player_health.put(dss.getKey(),
                            Objects.requireNonNull(dss.getValue()).toString());
                }
                for(Map.Entry<String, String> entry: player_health.entrySet()) {

                    String key = entry.getKey();
                    String value = entry.getValue();

                    if(key.equals("nickName")) {
                        player_name.setText(value);
                        listener_flag.setText(value);
                    }
                    if(key.equals("level")) {
                        player_lvl = Integer.parseInt(value);
                        listener_flag.setText(value);
                    }
                }
                HashMap<String, String> company_stage = new HashMap<>();
                for (DataSnapshot dss: snapshot
                        .child("Players")
                        .child(flag)
                        .child("Game")
                        .child("Astral").getChildren()) {
                    company_stage.put(dss.getKey(),
                            Objects.requireNonNull(dss.getValue()).toString());
                }
                for(Map.Entry<String, String> entry: company_stage.entrySet()) {

                    String key = entry.getKey();
                    String value = entry.getValue();

                    if(flagComplexity.equals("Лёгкий")) {
                        if(key.equals("easy")) {
                            hen = (int) (Integer.parseInt(list_hp.get(0))
                                    * Integer.parseInt(value)
                                    * 1.1987652);
                            health_enemy_line.setMax(hen);
                            health_enemy_line.setProgress(hen);
                            health_enemy_num.setText(String.valueOf(hen));
                            String cn = list_name.get(0);
                            creep_name.setText(cn);

                            //почему то не получает значение !!!!!!!!!!
                            level_num = value;

                            level.setText("Уровень " + value);
                            listener_flag.setText(value);
                        }
                    }
                    if(flagComplexity.equals("Средний")) {
                        if(key.equals("medium")) {
                            level.setText(level.getText() + value);
                        }
                    }
                    if(flagComplexity.equals("Тяжелый")) {
                        if(key.equals("hard")) {
                            level.setText(level.getText() + value);
                        }
                    }
                    if(flagComplexity.equals("Адский")) {
                        if(key.equals("hell")) {
                            level.setText(level.getText() + value);
                        }
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        listener_flag.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                counts++;
            }

            @Override
            public void afterTextChanged(Editable s) {
                if(counts == 13) {
                    hpn = hpnm * player_lvl;
                    health_player_line.setMax(hpn);
                    health_player_line.setProgress(hpn);
                    health_player_num.setText(String.valueOf(hpn));
                    md.dismiss();
                    Button btn = findViewById(R.id.btl);
                    btn.setVisibility(View.VISIBLE);
                    Log.e(player_name.getText().toString() + " " +
                            level_num + " " +
                            creep_name.getText().toString() + " " +
                            health_enemy_num.getText().toString() + " " +
                            health_player_num.getText().toString() + " " +
                            level.getText().toString() + " " +
                            player_cDmg + " " +
                            player_lvl + " " +
                            player_atk, "!!!!!!!!");
                }
            }
        });

        ImageButton close = findViewById(R.id.close);
        close.setOnClickListener(v -> finish());
        LinearLayout lay = findViewById(R.id.zarik_zone);
        pl.droidsonroids.gif.GifImageView pl = new pl.droidsonroids.gif.GifImageView(this);
        ImageView iv = new ImageView(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams
                (LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.MATCH_PARENT);
        Button btl = findViewById(R.id.btl);
        motion_check.setText("Ваш ход");
        btl.setOnClickListener(v -> {
            if(motion) {
                Random r1 = new Random();
                Random r2 = new Random();
                lay.removeView(pl);
                lay.removeView(iv);
                final Handler handler = new Handler();
                handler.postDelayed(() -> {
                    int zarikOne = r1.nextInt((6) + 1);
                    int zarikTwo = r2.nextInt((6) + 1);
                    while (zarikOne == 0 | zarikTwo == 0) {
                        zarikOne = r1.nextInt((6) + 1);
                        zarikTwo = r2.nextInt((6) + 1);
                    }
                    String s = "" + zarikOne + zarikTwo;
                    lay.removeView(pl);
                    lay.addView(iv, lp);
                    lay.setPadding(55, 55, 55, 55);
                    iv.setImageResource(getImageId(getBaseContext(), s));
                    int i = getPlayerAttack(
                            player_cDmg,
                            player_str,
                            player_atk,
                            player_lvl,
                            zarikTwo,
                            zarikOne);
                    hen = hen - i;
                    TextView tv_player = new TextView(this);
                    tv_player.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 25));
                    tv_player.setTextColor(WHITE);
                    tv_player.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
                    if (player_cDmg_status) {
                        tv_player.setText("Вы - нанесли критический удар: " + i);
                    }else{
                        tv_player.setText("Вы - нанесли удар: " + i);
                    }
                    tv_player.setGravity(Gravity.BOTTOM);
                    memo.addView(tv_player);
                    health_enemy_num.setText(String.valueOf(hen));
                    health_enemy_line.setProgress(hen);
                    if (hen <= 0) {
                        getExp(Integer.parseInt(level.getText().toString().substring(
                                level.getText().toString().length() - 1
                        )));

                        showResult(v, "Далее", "ПОБЕДА");
                        btl.setVisibility(View.GONE);
                        return;
                    }
                    player_cDmg_status = false;
                    motion = false;
                    motion_check.setText("Ход врага");
                    final Handler handler2 = new Handler();
                    handler2.postDelayed(() -> {
                        if (!motion) {
                            Random r3 = new Random();
                            Random r4 = new Random();
                            lay.removeView(pl);
                            lay.removeView(iv);
                            final Handler handler1 = new Handler();
                            handler1.postDelayed(() -> {
                                int zarikOne1 = r3.nextInt((6) + 1);
                                int zarikTwo2 = r4.nextInt((6) + 1);
                                while (zarikOne1 == 0 | zarikTwo2 == 0) {
                                    zarikOne1 = r3.nextInt((6) + 1);
                                    zarikTwo2 = r4.nextInt((6) + 1);
                                }
                                String s1 = "" + zarikOne1 + zarikTwo2;
                                lay.removeView(pl);
                                lay.addView(iv, lp);
                                lay.setPadding(55, 55, 55, 55);
                                iv.setImageResource(getImageId(getBaseContext(), s1));

                                int i1 = (Integer.parseInt(s1) * Integer.parseInt(level_num)/2)/15;
                                hpn = hpn - i1;

                                DatabaseReference bref = FirebaseDatabase.getInstance().getReference()
                                        .child("Players").child(flag).child("Player");
                                bref.addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                        bref.child("health").setValue(hpn);
                                    }
                                    @Override
                                    public void onCancelled(@NonNull DatabaseError error) {
                                    }
                                });
                                TextView tv_enemy = new TextView(this);
                                tv_enemy.setLayoutParams(new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 25));
                                tv_enemy.setTextColor(RED);
                                tv_enemy.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM);
                                if (i1 == 0) {
                                    tv_enemy.setText(creep_name.getText().toString()
                                            + " - промахнулся");
                                }else{
                                    tv_enemy.setText(creep_name.getText().toString()
                                            + " - нанес удар: "
                                            + i1);
                                }
                                tv_enemy.setGravity(Gravity.BOTTOM);
                                memo.addView(tv_enemy);
                                health_player_num.setText(String.valueOf(hpn));
                                health_player_line.setProgress(hpn);

                                if (hpn <= 0) {
                                    showResult(v, "Повтор", "Вы проиграли");
                                    btl.setVisibility(View.GONE);
                                    return;
                                }
                                btl.setVisibility(View.VISIBLE);
                                motion = true;
                                motion_check.setText("Ваш ход");
                            }, 1000);
                            lay.addView(pl, lp);
                            lay.setPadding(0, 0, 0, 0);
                            pl.setImageResource(R.drawable.zarik);
                        }
                    }, 1000);
                }, 1000);
                lay.addView(pl, lp);
                lay.setPadding(0, 0, 0, 0);
                pl.setImageResource(R.drawable.zarik);
                btl.setVisibility(View.INVISIBLE);
            }
        });
    }

    private static int getImageId(Context context, String imageName) {
        return context.getResources()
                .getIdentifier("drawable/zarik" + imageName,
                        null, context.getPackageName());
    }

    @SuppressLint("NewApi")
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus) {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    private void showWait(View v, waitDialog md) {
        md.requestWindowFeature(Window.FEATURE_NO_TITLE);
        md.getWindow().setBackgroundDrawable(new ColorDrawable(TRANSPARENT));
        md.show();
        md.setCancelable(false);
    }

    private void showResult(View v, String strB, String strR) {
        AstralBattleDialogResult adr = new AstralBattleDialogResult(this, strB, strR);
        adr.requestWindowFeature(Window.FEATURE_NO_TITLE);
        adr.getWindow().setBackgroundDrawable(new ColorDrawable(TRANSPARENT));
        DatabaseReference ref_result = FirebaseDatabase.getInstance().getReference();
        if(hen <= 0) {
            ref_result
                    .child("Players")
                    .child(flag)
                    .child("Game")
                    .child("Astral")
                    .child("easy")
                    .setValue(Integer.parseInt(level_num) + 1);
        }
        adr.show();
        adr.setCancelable(false);
    }

    public int getPlayerAttack(int criticalDamage,
                               int strength,
                               int damage,
                               int level,
                               int zarikTwo,
                               int zarikOne) {

        int dmg;
        Random random = new Random();
        int probability = criticalDamage + (zarikTwo * zarikOne);
        temp = String.valueOf(probability);
        if (random.nextInt(100) < probability)
        {
            dmg = (int) ((double) (strength * damage * level * 10) / 1.4101989);
            player_cDmg_status = true;
        }else{
            dmg = (int) ((double) (strength * damage * level * 10) / 2.5);
        }
        Random r = new Random();
        dmg = r.nextInt(dmg) + dmg/2;
        while (dmg == 0) {
            dmg = r.nextInt(dmg) + dmg/2;
        }


        return dmg;
    }

    public void getExp(int astralLevel) {
        try {
            XmlPullParser parser = getResources().getXml(R.xml.player_table_experience);
            while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {
                if (parser.getEventType() == XmlPullParser.START_TAG
                        && parser.getName().equals("level"+astralLevel)) {
                        String ii = parser.getAttributeValue(0);
                        exp_get = Integer.parseInt(ii) / astralLevel + exp;
                        Log.e(String.valueOf(astralLevel), "AL");
                        Log.e(ii, "II");
                        Log.e(String.valueOf(exp_get), "EXP GET");
                }
                parser.next();
            }
        }
        catch (Throwable t) {
            Toast.makeText(this,
                    "Ошибка при загрузке XML-документа : !!!!!!!!!" + t.toString(), Toast.LENGTH_LONG)
                    .show();
        }
        DatabaseReference r = FirebaseDatabase.getInstance().getReference();
        r
                .child("Players")
                .child(flag)
                .child("Stats")
                .child("Experience")
                .setValue(exp_get);
    }
}

код xml

    <?xml version="1.0" encoding="utf-8"?>
<player_table_experience>
    <level1
        l1 = "30"/>
    <level2
        l2 = "55"/>
    <level3
        l3 = "90"/>
    <level4
        l4 = "150"/>
    <level5
        l5 = "220"/>
    <level
        l6 = "320"/>
    <level
        l7 = "380"/>
    <level
        l8 = "420"/>
    <level
        l9 = "455"/>
    <level
        l10 = "500"/>
    <level l11 = "600"/>
    <level l12 = "700"/>
    <level l13 = "800"/>
    <level l14 = "900"/>
    <level l15 = "1000"/>
    <level l16 = "1100"/>
    <level l17 = "1200"/>
    <level l18 = "1300"/>
    <level l19 = "1400"/>
    <level l20 = "1500"/>
    <level l21 = "1800"/>
    <level l22 = "2100"/>
    <level l23 = "2400"/>
    <level l24 = "2700"/>
    <level l25 = "3000"/>
    <level l26 = "3300"/>
    <level l27 = "3600"/>
    <level l28 = "3900"/>
    <level l29 = "4200"/>
    <level l30 = "4500"/>
    <level l31 = "5400"/>
    <level l32 = "6300"/>
    <level l33 = "7200"/>
    <level l34 = "8100"/>
    <level l35 = "9000"/>
    <level l36 = "9900"/>
    <level l37 = "10800"/>
    <level l38 = "11700"/>
    <level l39 = "12600"/>
    <level l40 = "13500"/>
    <level l41 = "16200"/>
    <level l42 = "18900"/>
    <level l43 = "21600"/>
    <level l44 = "24300"/>
    <level l45 = "27000"/>
    <level l46 = "29700"/>
    <level l47 = "32400"/>
    <level l48 = "35100"/>
    <level l49 = "37800"/>
    <level l50 = "40500"/>
    <level l51 = "43200"/>
    <level l52 = "45900"/>
    <level l53 = "48600"/>
    <level l54 = "51300"/>
    <level l55 = "54000"/>
    <level l56 = "56700"/>
    <level l57 = "59400"/>
    <level l58 = "62100"/>
    <level l59 = "64800"/>
    <level l60 = "67500"/>
    <level l61 = "70200"/>
    <level l62 = "72900"/>
    <level l63 = "75600"/>
    <level l64 = "78300"/>
    <level l65 = "81000"/>
    <level l66 = "83700"/>
    <level l67 = "86400"/>
    <level l68 = "89100"/>
    <level l69 = "91800"/>
    <level l70 = "94500"/>
    <level l71 = "103950"/>
    <level l72 = "114345"/>
    <level l73 = "125779"/>
    <level l74 = "138356"/>
    <level l75 = "152201"/>
    <level l76 = "167421"/>
    <level l77 = "184163"/>
    <level l78 = "202579"/>
    <level l79 = "222836"/>
    <level l80 = "240662"/>
</player_table_experience>

Метод public void getExp(int astralLevel) работает только до 6 уровня. После прохождения уровня 6 в базу по адресу r.child(Players).child(flag).child("Player").child("Stats").child("Experience").setValue(get_exp) пишется 0 и по логам метод не срабатывает...Почему?


Ответы (1 шт):

Автор решения: weTr1k

Проблема найдена в .xml файле, намудрил с синтаксисом:

parser.getName().equals("level"+astralLevel)

, а в файле .xml дописка к level идет только до level5.

→ Ссылка