美文网首页
Activity间数据传递之从子Activity获取返回结果

Activity间数据传递之从子Activity获取返回结果

作者: 向着远方奔跑 | 来源:发表于2017-01-05 13:26 被阅读0次

    下面是一个测试用户地理知识的小demo,如图

    主QuizActivity

    点击“CHEAT!”即用户作弊后可以进入子Activity,再点击“SHOW ANSWER”即可显示答案,如图:


    子CheatActivity

    此时要实现通过CheatActivity把用户是否偷看答案的情况通知给QuizActivity

    • 需要从子Activity获取返回信息,可调用一下Activity方法:
    public void startActivityForResult(Intent intent, int requestCode)
    

    在QuizActivity中添加如下代码

    private static final int REQUEST_CODE_CHEAT = 0;
    

    在CHEAT按键使用startActivityForResult方法

    mCheatButton.setOnClickListener(new View.OnClickListener() {            
          @Override            
          public void onClick(View view) {                
              boolean answerIsTrue = mQuestionsBank[mCurrentIndex].isAnswerTrue();                
              Intent i = CheatActivity.newIntent(QuizActivity.this, answerIsTrue);
              //startActivity(i);                
              startActivityForResult(i, REQUEST_CODE_CHEAT);           
           }        
    });
    

    设置返回结果

    • 实现子CheatActivity发送返回信息给父QuizActivity,有以下两种方法可供调用:
      public final void setResult(int resultCode)
      public final void setResult(int resultCode, Intent data)
      一般来说,参数resultCode是以下两个预定义常量中的一个
      Activity.RESULT_OK
      Activity.RESULT_CANCELED
      在CheatActivity中调用setResult方法,即用户点击SHOW ANSWER按钮查看了答案,则会返回给父QuizActivity结果代码Activity.RESULT_OK,若用户没有点击直接后退,则返回Activity.RESULT_CANCELED

    返还intent

    • 在CheatActivity中要将数据信息回传给QuizActivity,则需要创建一个Intent,附加extra信息后,调用setResult方法将信息回传给QuizActivity
    private static final String EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown";
    
    mShowAnswer.setOnClickListener(new View.OnClickListener() {      
              @Override    
              public void onClick(View view) {       
                     if (mAnswerIsTrue) {            
                         mAnswerTextView.setText(R.string.true_button);        
                     } else {            
                          mAnswerTextView.setText(R.string.false_button);        
                     }        
                     setAnswerShownResult(true); 
             }
    });
    
    private void setAnswerShownResult(boolean isAnswerShown) {    
          Intent data = new Intent();    
          data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);    
          setResult(RESULT_OK, data);}
    
    • 用户点击SHOW ANSWER按钮时,CheatActivity调用setResult方法将结果代码及intent打包,然后用户单机后退键回到QuizActivity时,ActivityManager调用activity的以下方法:
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    

    该方法参数来自QuizActivity的原始请求代码及传入setResult方法的结果代码和intent,最后覆盖QuizActivity的onActivityResult(int, int, Intent)方法来处理返回结果。然而,结果Intent的内容就是CheatActivity中传给EXTRA_ANSWER_SHOWN的值,因而还要添加一个方法来获取到此值

    public static boolean wasAnswerShown(Intent result) {    
          return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false);
    }
    

    处理返回结果

    • 在QuizActivity中新增一个成员变量保存CheatActivity回传的值,然后覆盖onActivityResult方法获取它。注意检查请求代码和返回代码是否符合预期,这是最佳代码实践,方便将来进行维护
    private boolean mIsCheater;
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
            if (resultCode != Activity.RESULT_OK) {        
                return;    
            }    
            if (requestCode == REQUEST_CODE_CHEAT) {        
                if (data == null) {            
                return;        
            }        
            mIsCheater = CheatActivity.wasAnswerShown(data);    
        }
    }
    

    此时,QuizActivity就成功的拿到了CheatActivity回传过来的值,完成了在Activity间的传递数据

    相关文章

      网友评论

          本文标题:Activity间数据传递之从子Activity获取返回结果

          本文链接:https://www.haomeiwen.com/subject/tfxzvttx.html