RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 592887
Accepted
Maxgmer
Maxgmer
Asked:2020-11-19 02:23:57 +0000 UTC2020-11-19 02:23:57 +0000 UTC 2020-11-19 02:23:57 +0000 UTC

进度条不工作。安卓

  • 772

我有一个包含两个活动的应用程序。当我切换到第二个活动时,数字是从 firebase 数据库中获取的,基于填充的进度条位于片段中。我的问题是,当我进入活动时,进度条没有填满,但如果我按下系统后退按钮(这将使我们返回到上一个活动),然后再次启动活动,进度条就会填满!我完全不知道为什么会这样。进度条填充在片段的 onCreateView() 中,对象是在活动的 onCreate() 中从数据库中读取的。重新创建片段时,没有任何变化,由此我得出结论,问题出在从数据库加载时。但是为什么会出现这个问题呢,因为我第二次去有fragment的activity的时候,执行的是和第一次执行的代码是一样的!

我真诚地希望得到你的支持,因为我不知道该怎么办了。


onCreate()方法代码:

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

    auth = FirebaseAuth.getInstance();
    user = auth.getCurrentUser();



    if (user != null) {
        // already signed in
        uid = user.getUid();
        name = user.getDisplayName();
        email = user.getEmail();
    } else {
        // not signed in
        startActivityForResult(
                AuthUI.getInstance()
                        .createSignInIntentBuilder()
                        .setProviders(Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
                                new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build()//,
                                // new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build()
                                // new AuthUI.IdpConfig.Builder(AuthUI.TWITTER_PROVIDER).build()
                        ))
                        .build(),
                200);
    }

    database = FirebaseDatabase.getInstance();

    if (uid != null) {
        charRef = database.getReference("Users").child(uid).child("Character");

        charRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                    myCharacter = dataSnapshot.getValue(Runner.class);
                    SnickNameBottom = myCharacter.getNickname();
                    currentSpeed = myCharacter.getSpeed();
                    currentStr = myCharacter.getStrength();
                    currentStamina = myCharacter.getStamina();
                    currentIntuition = myCharacter.getIntuition();
                    SlevelBottom = getString(R.string.level) + myCharacter.getCurrentLevel();
                    nickNameBottom = (TextView) findViewById(R.id.nickNameBottom);
                    levelBottom = (TextView) findViewById(R.id.levelBottom);
                    nickNameBottom.setText(SnickNameBottom);
                    levelBottom.setText(SlevelBottom);
                    stamFromEq = myCharacter.getStaminaFromEquipment();
                    strFromEq = myCharacter.getStrengthFromEquipment();
                    spdFromEq = myCharacter.getSpeedFromEquiment();
                    winsInARow = myCharacter.getWinsInARow();
                    wins = myCharacter.getWins();
                    defeats = myCharacter.getDefeats();
                    tournamentsTotal = myCharacter.getTournamentsTotal();
                    winsInTournaments = myCharacter.getWinsInTournaments();
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value


            }
        });
    }
    if (savedInstanceState == null) {
        getFragmentManager()
                .beginTransaction()
                .add(R.id.container, new CardFrontFragment())
                .commit();
    }

}

片段 onCreateView() 方法代码:

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.card_front, container, false);
            nickNameBottom = (TextView) view.findViewById(R.id.nickNameBottom);
            levelBottom = (TextView) view.findViewById(R.id.levelBottom);
            progressStr = (RoundCornerProgressBar) view.findViewById(R.id.strengthbar);
            progressSpd = (RoundCornerProgressBar) view.findViewById(R.id.speedbar);
            progressStamina = (RoundCornerProgressBar) view.findViewById(R.id.staminabar);
            progressIntuition = (RoundCornerProgressBar) view.findViewById(R.id.intuitionBar);

            nickNameBottom.setText(SnickNameBottom);
            levelBottom.setText(SlevelBottom);

            statsSum = (float) currentSpeed + currentStamina + currentStr;
            progressStr.setMax(statsSum);
            progressStr.setProgress((float)currentStr);
            progressStr.setSecondaryProgress((float) strFromEq);

            progressSpd.setMax(statsSum);
            progressSpd.setProgress((float)currentSpeed);
            progressSpd.setSecondaryProgress((float)spdFromEq);

            progressStamina.setMax(statsSum);
            progressStamina.setProgress((float)currentStamina);
            progressStamina.setSecondaryProgress((float)stamFromEq);

            progressIntuition.setMax(statsSum);
            progressIntuition.setProgress((float) currentIntuition);

            TextView totalPlayed = (TextView) view.findViewById(R.id.total);
            totalPlayed.setText(getString(R.string.total) + " " + (wins + defeats));

            TextView winsT = (TextView) view.findViewById(R.id.wins);
            winsT.setText(getString(R.string.wins) + " " + wins);

            TextView defeatsT = (TextView) view.findViewById(R.id.defeats);
            defeatsT.setText(getString(R.string.defeats) + " " + defeats);

            TextView tournamentsTotalT = (TextView) view.findViewById(R.id.tournamentsTotal);
            tournamentsTotalT.setText(getString(R.string.tournamentsTotal) + " " + tournamentsTotal);

            TextView tournamentsWinsT = (TextView) view.findViewById(R.id.tournamentsWins);
            tournamentsWinsT.setText(getString(R.string.tournamentsWins) + " " + winsInTournaments);

            TextView winsInARowT = (TextView) view.findViewById(R.id.winsInARow);
            winsInARowT.setText(getString(R.string.winsInARow) + " " + winsInARow);

            return view;

进行了一项实验,启动了活动,关闭了互联网,按下并重新启动 - 一切都被填满了。所以所有的数据都已经从第一次加载了。

这是一段视频,清楚地展示了一切。

android
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    lllyct
    2020-11-23T00:50:04Z2020-11-23T00:50:04Z

    调用 onCreateView 片段后,您的数据就可以收到了。我不太明白你的数据是如何从活动传输到片段的,我建议在片段中加载数据或者以某种方式通知它数据已经加载。例如在一个片段中:

    private boolean mViewCreated = false;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.card_front, container, false);
        nickNameBottom = (TextView) view.findViewById(R.id.nickNameBottom);
        levelBottom = (TextView) view.findViewById(R.id.levelBottom);
        progressStr = (RoundCornerProgressBar) view.findViewById(R.id.strengthbar);
        progressSpd = (RoundCornerProgressBar) view.findViewById(R.id.speedbar);
        progressStamina = (RoundCornerProgressBar) view.findViewById(R.id.staminabar);
        progressIntuition = (RoundCornerProgressBar) view.findViewById(R.id.intuitionBar);
    
        return view;
    }
    
    public void onDataLoaded() {
        tryShowData();
    }
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mViewCreated = true;
        tryShowData();
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mViewCreated = false;
    }
    
    private void tryShowData() {
        if (!mViewCreated) {
            return;
        }
        nickNameBottom.setText(SnickNameBottom);
        levelBottom.setText(SlevelBottom);
    
        statsSum = (float) currentSpeed + currentStamina + currentStr;
        progressStr.setMax(statsSum);
        progressStr.setProgress((float)currentStr);
        progressStr.setSecondaryProgress((float) strFromEq);
    
        progressSpd.setMax(statsSum);
        progressSpd.setProgress((float)currentSpeed);
        progressSpd.setSecondaryProgress((float)spdFromEq);
    
        progressStamina.setMax(statsSum);
        progressStamina.setProgress((float)currentStamina);
        progressStamina.setSecondaryProgress((float)stamFromEq);
    
        progressIntuition.setMax(statsSum);
        progressIntuition.setProgress((float) currentIntuition);
    
        TextView totalPlayed = (TextView) view.findViewById(R.id.total);
        totalPlayed.setText(getString(R.string.total) + " " + (wins + defeats));
    
        TextView winsT = (TextView) view.findViewById(R.id.wins);
        winsT.setText(getString(R.string.wins) + " " + wins);
    
        TextView defeatsT = (TextView) view.findViewById(R.id.defeats);
        defeatsT.setText(getString(R.string.defeats) + " " + defeats);
    
        TextView tournamentsTotalT = (TextView) view.findViewById(R.id.tournamentsTotal);
        tournamentsTotalT.setText(getString(R.string.tournamentsTotal) + " " + tournamentsTotal);
    
        TextView tournamentsWinsT = (TextView) view.findViewById(R.id.tournamentsWins);
        tournamentsWinsT.setText(getString(R.string.tournamentsWins) + " " + winsInTournaments);
    
        TextView winsInARowT = (TextView) view.findViewById(R.id.winsInARow);
        winsInARowT.setText(getString(R.string.winsInARow) + " " + winsInARow);
    }
    

    在活动中:

    charRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
                myCharacter = dataSnapshot.getValue(Runner.class);
                SnickNameBottom = myCharacter.getNickname();
                currentSpeed = myCharacter.getSpeed();
                currentStr = myCharacter.getStrength();
                currentStamina = myCharacter.getStamina();
                currentIntuition = myCharacter.getIntuition();
                SlevelBottom = getString(R.string.level) + myCharacter.getCurrentLevel();
                nickNameBottom = (TextView) findViewById(R.id.nickNameBottom);
                levelBottom = (TextView) findViewById(R.id.levelBottom);
                nickNameBottom.setText(SnickNameBottom);
                levelBottom.setText(SlevelBottom);
                stamFromEq = myCharacter.getStaminaFromEquipment();
                strFromEq = myCharacter.getStrengthFromEquipment();
                spdFromEq = myCharacter.getSpeedFromEquiment();
                winsInARow = myCharacter.getWinsInARow();
                wins = myCharacter.getWins();
                defeats = myCharacter.getDefeats();
                tournamentsTotal = myCharacter.getTournamentsTotal();
                winsInTournaments = myCharacter.getWinsInTournaments();
    
                Fragment fragment = getSupportFragmentManager()
                        .findFragmentById(R.id.container);
                if (fragment != null) {
                    ((CardFrontFragment)fragment).onDataLoaded();
                }
        }
    
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
    
    
        }
    });
    
    • 1
  2. Harco
    2020-11-21T15:43:49Z2020-11-21T15:43:49Z

    尝试在 super.onViewCreated() 之后在片段的 onViewCreated() 方法中设置数据;

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5