2017-05-19 4 views
-3

10 개의 질문과 10 개의 카운트 다운 타이머로 구성된 간단한 퀴즈 앱을 만들고 있습니다. 즉, 질문마다 10 개의 활동을 의미합니다. 점수 매기기는 CountDownTimer 메서드에서 각 질문에 올바르게 응답하는 동안 남은 시간을 곱해서 작동합니다. 따라서 score = answer * timeLeft; 그리고 총 점수는 활동 10 후에 활동이 끝날 때 ResultActivity에 인쇄됩니다. 문제는 각 활동을 통해 내 점수 변수를 전달할 수 없으며 활동 10에서 결과 활동까지 의도 한 다음 버튼을 클릭하면 ResultActivity를 열 수 없거나 강제로 닫습니다. ResultActivity에한 액티비티에서 다른 액티비티로 다양한 점수 전달하기

package com.finalproject.logicaltest; 

/** 
* Created by VICKY on 19-May-17. 
*/ 

import android.app.Activity; 
import android.content.Intent; 
import android.os.CountDownTimer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.TypedValue; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.TextView; 

import butterknife.ButterKnife; 
import butterknife.Bind; 

import static com.finalproject.logicaltest.R.id.rb1; 
import static com.finalproject.logicaltest.R.id.rb2; 
import static com.finalproject.logicaltest.R.id.rb3; 
import static com.finalproject.logicaltest.R.id.rb4; 
import static com.finalproject.logicaltest.R.id.rb5; 

public class TestActivity10 extends AppCompatActivity { 

    @Bind(rb1) RadioButton rB1; 
    @Bind(rb2) RadioButton rB2; 
    @Bind(rb3) RadioButton rB3; 
    @Bind(rb4) RadioButton rB4; 
    @Bind(rb5) RadioButton rB5; 
    @Bind(R.id.end) Button bEnd; 
    @Bind(R.id.timer) TextView cDown; 

    public int answer = 0; 
    public int score = 0; 
    public long timeLeft = 0; 
    //The number of milliseconds in the future from 
    //the call to start() until the countdown is done 
    public long millisInFuture = 11000; //11 seconds 
    //The interval along the way to receive onTick(long) callbacks 
    long countDownInterval = 1000; //1 second 

    public long millisUntilFinished; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test10); 
     ButterKnife.bind(this); 
     score = getIntent().getExtras().getInt("score"); 

     setTimer(); 
    } 

    public void setTimer() { 


     //Initialize a new CountDownTimer instance 
     final CountDownTimer timer = new CountDownTimer(millisInFuture,countDownInterval){ 
      public void onTick(long millisUntilFinished){ 
       //do something in every tick 
       //Display the remaining seconds to app interface 
       //1 second = 1000 milliseconds 
       cDown.setText("" + millisUntilFinished/1000); 
       timeLeft = millisUntilFinished/1000; 
      } 
      public void onFinish(){ 
       //Do something when count down finished 
       cDown.setText("NEXT!"); 
       Intent intent = new Intent(TestActivity10.this,ResultActivity.class); 
       intent.putExtra("score", score); 
       startActivity(intent); 
       finish(); 
       timeLeft = 0; 
      } 
     }.start(); 


     bEnd.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       timer.cancel(); 
       timeLeft = millisUntilFinished; 
       Intent intent = new Intent(TestActivity10.this,ResultActivity.class); 
       intent.putExtra("score", score); 
       startActivity(intent); 
       finish(); 
       overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
      } 

     }); 
    } 

    public void onRadioButtonClicked (View v) { 

     boolean checked = ((RadioButton) v).isChecked(); 

     switch (v.getId()) { 

      case rb1: 
       if (checked){ 
        answer = 0; 
        break; 
       } 

      case rb2: 
       if (checked){ 
        answer++; 
        break; 
       } 

      case rb3: 
       if (checked){ 
        answer = 0; 
        break; 
       } 

      case rb4: 
       if (checked){ 
        answer = 0; 
        break; 
       } 

      case rb5: 
       if (checked){ 
        answer = 0; 
        break; 
       } 
     } 

     score += ((int)(timeLeft) * Integer.valueOf(answer)); 

    } 




} 

그리고 인쇄 된 총 점수 :

그것은이 같은 TestActivity10 때까지 TestActivity2을 통해 putExtra로 점수를 통과

package com.finalproject.logicaltest; 

import android.content.Intent; 
import android.os.CountDownTimer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CompoundButton; 
import android.widget.RadioButton; 
import android.widget.TextView; 

import java.util.Timer; 

import butterknife.ButterKnife; 
import butterknife.Bind; 

import static android.R.id.message; 
import static android.R.string.cancel; 
import static com.finalproject.logicaltest.R.id.rb1; 
import static com.finalproject.logicaltest.R.id.rb2; 
import static com.finalproject.logicaltest.R.id.rb3; 
import static com.finalproject.logicaltest.R.id.rb4; 


public class TestActivity1 extends AppCompatActivity { 

    @Bind(R.id.rb1) RadioButton rB1; 
    @Bind(R.id.rb2) RadioButton rB2; 
    @Bind(R.id.rb3) RadioButton rB3; 
    @Bind(R.id.rb4) RadioButton rB4; 
    @Bind(R.id.next) Button bNext; 
    @Bind(R.id.timer) TextView cDown; 

    public int answer = 0; 
    public int score = 0; 
    public long timeLeft = 0; 
    //The number of milliseconds in the future from 
    //the call to start() until the countdown is done 
    public long millisInFuture = 11000; //11 seconds 
    //The interval along the way to receive onTick(long) callbacks 
    long countDownInterval = 1000; //1 second 

    public long millisUntilFinished; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test1); 
     ButterKnife.bind(this); 

     setTimer(); 

    } 

    public void setTimer() { 

     //Initialize a new CountDownTimer instance 
     final CountDownTimer timer = new CountDownTimer(millisInFuture,countDownInterval){ 
      public void onTick(long millisUntilFinished){ 
       //do something in every tick 
       //Display the remaining seconds to app interface 
       //1 second = 1000 milliseconds 
       cDown.setText("" + millisUntilFinished/1000); 
       timeLeft = millisUntilFinished/1000; 

      } 
      public void onFinish(){ 
       //Do something when count down finished 
       cDown.setText("NEXT!"); 
       Intent intent = new Intent(TestActivity1.this,TestActivity2.class); 
       intent.putExtra("score", score); 
       startActivity(intent); 
       finish(); 
       timeLeft = 0; 
      } 


     }.start(); 

     bNext.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       timer.cancel(); 
       timeLeft = millisUntilFinished; 
       Intent intent = new Intent(TestActivity1.this,TestActivity2.class); 
       intent.putExtra("score", score); 
       startActivity(intent); 
       finish(); 
       overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

      } 

     }); 

    } 

    public void onRadioButtonClicked (View v) { 

     boolean checked = ((RadioButton) v).isChecked(); 

     switch (v.getId()) { 

      case rb1: 
       if (checked){ 
        answer++; 
        break; 
       } 

      case rb2: 
       if (checked){ 
        answer = 0; 
        break; 
       } 

      case rb3: 
       if (checked){ 
        answer = 0; 
        break; 
       } 

      case rb4: 
       if (checked){ 
        answer = 0; 
        break; 
       } 
     } 

     score = ((int)(timeLeft) * Integer.valueOf(answer)); 

    } 




} 

TestActivity1 :

package com.finalproject.logicaltest; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

import static android.R.id.message; 


public class ResultActivity extends AppCompatActivity { 
    public int score = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_result); 
     score = getIntent().getExtras().getInt("score"); 
     TextView result = (TextView) findViewById(R.id.total_score); 
     result.setText(score); 
    } 
} 

여기 내 코드입니다 내 코드에 무슨 문제가 있습니까?

+2

결과의 값을 공유 환경 설정에 저장할 수 있으며 항상 결과를 전달하는 대신 결과 화면에 표시 할 수 있습니다. – Anmol

+3

각 질문마다 활동을 작성하는 이유는 무엇입니까? 단편을 사용하고 질문을 할 때마다 여러 번 다시 사용해야합니다. – Sac

+2

'나는 각 질문마다 10 초 카운트 다운 타이머가있는 10 개의 질문으로 구성된 간단한 퀴즈 앱을 만들고 있는데, 이것은 질문에 대한 10 가지 활동을 의미합니다. 이것은 잘못된 방식으로 문제를 해결하려고하는 것처럼 보입니다. 각 질문에 대해 새로운 활동을 작성하는 대신 질문을 한 다음 그 질문을 표시하는 일반 활동을 하나만 가질 수 있다고 생각합니다. 현재 10 가지 활동은 모두 기본적으로 서로 복제되어 있습니다.그것들을 유지하는 것은 시간이 갈수록 훨씬 더 어려워 질 것입니다. – nbokmans

답변

0

안녕하세요 사용하여 논리

선언 및 초기화

을에 따르면, 도움이 될 수이 코드를 사용해보십시오
SharedPreferences sharedpreferences; 
sharedpreferences = getSharedPreferences("results", Context.MODE_PRIVATE); 

당신이 잘못 당신의 텍스트 뷰에 score을 설정하는 IMO 저장된 데이터

SharedPreferences prefs = this.getSharedPreferences("results", Context.MODE_PRIVATE); 
String lanSettings = prefs.getString("score", null); 
+0

이 코드를 어디에 써야합니까? onCreate에서? public class? 또는 어떤 방법? –

+0

테스트를 시작하기 전에 SharedPreferences가 있어야합니다. onCreate는 여기에서 올바르게 작동합니다. –

+0

이 코드를 추가하거나 다른 잘못된 코드로 교체해야합니까? 어느 것이 내가 대신해야합니까? 선언문에서 광산과 달리'public int score = 0;과 같은 전역 변수를 선언하지 않았습니까? 아니면 자동으로 작동합니까? 거기에 putExtra()를 쓰거나 SharedPreferences로 바꾸어야합니까? –

0

당신은 그것을 위해 응용 프로그램 클래스를 사용 당신이 원하는 모든 클래스에서 액세스 할 수있는 응용 프로그램 클래스의 점수 값을 절약 할 수 있습니다. (당신은 단지 점수 값을 저장해야한다.) 더 많은 정보를 원하시면 확인할 수 here

는 희망이 도움이 ..

+0

이것이 좋은 해결책 인 동안 이것은 일반적으로 권장되지 않는다. 'Application' 클래스가이 데이터를 보유해야하는 이유는 무엇입니까? 의도와 부가 기능을 통해 전달하는 것이 좋습니다. – nbokmans

+0

해당 Application 클래스에 대해서만 점수 값 ....이 필요합니다. 의심의 여지가있는 의도는 좋은 접근 방식이지만, 응용 프로그램 클래스도 여기에서 작동 할 수 있습니다. 링크를 확인하십시오. –

+0

요점은 Application 클래스의 모든 것을 덤프하면 빠르게 테스트/리팩터링을 수행하는 괴물이되는 밀접하게 결합 된 시스템이된다는 것입니다. – nbokmans

0

를 가져 오는 다른 활동

SharedPreferences.Editor editor = sharedpreferences.edit(); 
      editor.putString("score", score); 
      editor.commit(); 

에서 사용하는 점수를 저장. 중 하나는 다음과 같이 설정하십시오 :이 작동하는지

result.setText(" "+score); 

참조 :
result.setText(String.valueOf(score)); 

또는 같은

.

+0

작동하지만 ResultActivity Sir에 0을 표시합니다. ( –

관련 문제