2014-01-07 41 views
1

Iam正在做一个IQtest应用程序。我需要从一个活动发送2个数据到2个不同的活动。但是当我通过单个onClickListener发送它们时,应用程序崩溃。这里错了吗?还是我可以不点击按钮发送数据?当两个intents声明在同一个onClickListener中时,应用程序崩溃

这是AgeCalculation.java

package com.example.iqtest; 
public class AgeCalculation extends Activity implements OnTouchListener 
{ 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_age_calculation); 
    mDate = (EditText) findViewById(R.id.edDate); 
    age = (EditText) findViewById(R.id.edAge); 
    calage = (Button) findViewById(R.id.btnCalculateAge); 
    go = (Button) findViewById(R.id.button1); 
    category=(EditText) findViewById(R.id.category); 
    final Calendar c = Calendar.getInstance(); 
    Year = c.get(Calendar.YEAR); 
    Month = c.get(Calendar.MONTH); 
    Day = c.get(Calendar.DAY_OF_MONTH); 
    mDate.setOnTouchListener(this); 


    calage.setOnClickListener(new Button.OnClickListener(){ 
     public void onClick(View v){ 
      Intent i = new Intent(AgeCalculation.this,ResultActivity.class); 
      i.putExtra("ti",timetotake); 
      startActivity(i); 
      Calendar now= Calendar.getInstance(); 
      Calendar calendar = Calendar.getInstance(); 

      calendar.set(Year, Month, Day); 

      int years = now.get(Calendar.YEAR) - calendar.get(Calendar.YEAR); 
      int months = now.get(Calendar.MONTH) - calendar.get(Calendar.MONTH); 
      int days = now.get(Calendar.DAY_OF_MONTH) - calendar.get(Calendar.DAY_OF_MONTH); 
      if (days < 0){ 
       months --; 
       days +=now.getActualMaximum(Calendar.DAY_OF_MONTH); 
      } 
      if (months < 0){ 
       years --; 
       months +=12; 
      } 
      String yearsold = years+" YEARS "+months+ " MONTHS "+days+" DAYS"+" "+"OLD"; 
      age.setText(yearsold); 
      if(years>=0 && years<=10) 
      { 
       opt=0; 
      }else if(years>=11 && years<=15) 
      { 
       opt=1; 
      }else if(years>=16 && years<=30) 
      { 
       opt=2; 
      } 
      else if(years>=31 && years<=50) 
      { 
       opt=3; 
      }else if(years>=51 && years<=120) 
      { 
       opt=4; 
      }else 
      { 
       opt=5; 
      } 
      switch (opt) { 
      case 0: 
       start=0; 
       temp=" KIDS"; 
       timetotake=480; 
       break; 
      case 1: 
       start=20; 
       temp=" CHILDREN"; 
       timetotake=480; 
       break; 
      case 2: 
       start=40; 
       temp="TEENAGERS"; 
       timetotake=540; 
       break; 
      case 3: 
       start=60; 
       temp="ADULTS"; 
       timetotake=540; 
       break; 
      case 4: 
       start=80; 
       temp="ELDERS"; 
       timetotake=600; 
       break; 
      case 5: 
       temp="ALIENS!!"; 
       break; 
      default: 
       temp="ALIENS!!"; 
       break; 
      } 
      category.setText(temp); 
      go.setText("GO"+" "+"TO"+" "+temp+" "+"IQTEST"); 
      } 
    }); 

    go = (Button) findViewById(R.id.buttongo); 
    go.setOnClickListener(new View.OnClickListener()   
    { 
     public void onClick(View view) 
     { 
      Intent intent = new /*Here Iam using two intents to send data to two different activities QuizActivity and result activity*/Intent(AgeCalculation.this,QuizActivity.class); 
      intent.putExtra("start", start); 
      startActivity(intent); 
      Intent i = new Intent(AgeCalculation.this,ResultActivity.class); 
      i.putExtra("ti",timetotake); 
      startActivity(i); 
     } 


}); 
} 

@Override 
protected Dialog onCreateDialog(int id) 
{ 
    switch (id) { 

     case DATE_DIALOG_ID: 
      return new DatePickerDialog(
       this, DateSetListener, Year, Month, Day); 
    } 
    return null; 
} 

private DatePickerDialog.OnDateSetListener DateSetListener = 
    new DatePickerDialog.OnDateSetListener() 
    { 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
     Year = year; 
     Month = monthOfYear; 
     Day = dayOfMonth; 
     String sdate = lp(Day + "", "0", 2)+ " " + montharray[Month] + " " + Year; 
     mDate.setText(sdate); 

    } 

}; 

private String lp(String sc, String sp, int len) { 
     String sr = sc; 
     for (int i = sr.length(); i < len; i++) { 
      sr = sp + sr; 
     } 
     return new String(sr); 
    } 

@Override 
public boolean onTouch(View arg0, MotionEvent arg1) { 

    showDialog(DATE_DIALOG_ID); 
    return false; 
} 
} 

这是QuizActivity.java

package com.example.iqtest; 
public class QuizActivity extends Activity { 
List<Question> quesList; 
int score,qid,temp; 
int secs; 
Question currentQ; 
TextView txtQuestion; 
RadioButton rda, rdb, rdc,rdd,rde; 
Button butNext,agecal; 
private Button pause; 
private TextView timerValue; 
private long startTime = 0L; 
private Handler customHandler = new Handler(); 
long timeInMilliseconds = 0L; 
long timeSwapBuff = 0L; 
long updatedTime = 0L; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_quiz); 
    timerValue = (TextView) findViewById(R.id.textView2); 
    startTime = SystemClock.uptimeMillis(); 
    customHandler.postDelayed(updateTimerThread, 0); 

    pause = (Button) findViewById(R.id.pause); 
    pause.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      timeSwapBuff += timeInMilliseconds; 
      customHandler.removeCallbacks(updateTimerThread); 
       // or View.INVISIBLE depending on what you want to do 
      pause.setVisibility(View.INVISIBLE); 
      Intent i = new Intent(QuizActivity.this,Timeplease.class); 
      startActivity(i); 
      finish(); 
     } 
    }); 

    Bundle b = getIntent().getExtras(); 
    qid=b.getInt("start"); 
    temp=qid; 
    agecal = (Button) findViewById(R.id.buttoncalage); 
    agecal.setOnClickListener(new View.OnClickListener()   
    { 
     public void onClick(View view) 
     { 
      Intent i = new Intent(QuizActivity.this,AgeCalculation.class); 
      startActivity(i); 
      finish(); 
     } 

}); 
    DbHelper db=new DbHelper(this); 
    quesList=db.getAllQuestions(); 
    currentQ=quesList.get(qid); 
    txtQuestion=(TextView)findViewById(R.id.textView1); 
    rda=(RadioButton)findViewById(R.id.radio0); 
    rdb=(RadioButton)findViewById(R.id.radio1); 
    rdc=(RadioButton)findViewById(R.id.radio2); 
    rdd=(RadioButton)findViewById(R.id.radio3); 
    rde=(RadioButton)findViewById(R.id.radio4); 
    butNext=(Button)findViewById(R.id.button1); 
    setQuestionView(); 
    butNext.setOnClickListener(new View.OnClickListener() {  
     @Override 
     public void onClick(View v) { 
      RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1); 
      RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId()); 
      if(currentQ.getanswer().equals(answer.getText())) 
      { 
       score++; 
      } 
      if(qid<(temp+20)){     
       currentQ=quesList.get(qid); 
       setQuestionView(); 
      }else{ 
       Intent intent = new Intent(QuizActivity.this, ResultActivity.class); 
       Bundle b = new Bundle(); 
       b.putInt("score", score); 
       b.putInt("time",secs); 
       //Your score 
       intent.putExtras(b); //Put your score to your next Intent 
       startActivity(intent); 
       finish(); 
      } 
     } 
    }); 
} 
private void setQuestionView() 
{ 
    txtQuestion.setText(currentQ.getquestion()); 
    rda.setText(currentQ.getopta()); 
    rdb.setText(currentQ.getoptb()); 
    rdc.setText(currentQ.getoptc()); 
    rdd.setText(currentQ.getoptd()); 
    rde.setText(currentQ.getopte()); 
    qid++; 
} 
private Runnable updateTimerThread = new Runnable() { 
public void run() { 
timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 
updatedTime = timeSwapBuff + timeInMilliseconds; 
secs = (int) (updatedTime/1000); 
int mins = secs/60; 
secs = secs % 60; 
int milliseconds = (int) (updatedTime % 1000); 
timerValue.setText("" + mins + ":" + String.format("%02d", secs) + ":"+ String.format("%03d", milliseconds));customHandler.postDelayed(this, 0); 
} 
}; 

} 

这是ResultActivity.java

package com.example.iqtest; 
public class ResultActivity extends Activity { 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_result); 
     //get rating bar object 

     //get text view 
     TextView t=(TextView)findViewById(R.id.textResult); 
     //get score 
     Bundle b = getIntent().getExtras(); 
     int score= b.getInt("score"); 
     int timetaken= b.getInt("time"); 
     Bundle a = getIntent().getExtras(); 
     int timetobetaken= a.getInt("ti"); 
     int iqscore=score*160/20*timetobetaken/timetaken; 
     //display score 
     t.setText("YOUR SCORE IS"+ " "+ iqscore); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.result, menu); 
     return true; 
    } 
} 

这是Timeplease.java

package com.example.iqtest; 
public class Timeplease extends Activity { 
Button back; 
Context context; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context=this; 
    setContentView(R.layout.activity_timeplease); 
    addListenerOnButton(); 
} 
public void addListenerOnButton() 
{ 
    back = (Button) findViewById(R.id.buttonback); 
    back.setOnClickListener(new View.OnClickListener()  
    { 
     public void onClick(View view) 
     { 
      Intent i = new Intent(context,QuizActivity.class); 
      startActivity(i); 
      finish(); 
     } 

}); 
} 
} 
+0

使用一个对象来更新您的值。 – Skynet

+0

你的错误在哪里? – GrIsHu

+0

这个错误是当我在AgeCalculation中使用两个intent按钮时。java – user3167936

回答

0

后得到执行这行代码,

Intent i = new Intent(AgeCalculation.this,ResultActivity.class); 
i.putExtra("ti",timetotake); 
startActivity(i); 

ResultActivity获取呈现。 AgeCalculation中的其他代码行不会执行。因此,您在ResultActivity类中期望的值将为空。

这可能是导致崩溃的原因。

此外,请检查logcat,它会告诉您导致崩溃的代码行。

+0

确切..我知道,但如何以其他方式我可以发送数据到另一个活动? – user3167936

+0

@ user3167936,将数据保存在共享首选项中,并在需要时进行修改。这是最简单的选项 – Prem

0

在您的AgeCalculation活动中,您仅传递Intent中的值因此,您只需要使用Intent intent = getIntent();即可获得值。由于您尚未在Bundle中添加值,因此无法获取Bundle中的值。

为了从Bundle获得值,您可以使用Bundle b = getIntent().getExtras();从捆绑包中获取值。

试试如下:

Bundle b = getIntent().getExtras(); 
    if(b.containsKey("score") || b.containsKey("time")) 
    { 
    int score= b.getInt("score"); 
    int timetaken= b.getInt("time"); 
    } 

    Intent intent = getIntent(); 
    int timetobetaken=intent.getIntExtra("ti",0); 

在你AgeCalculation类,你都simultaously开始在你的旅途中键单击两个活动,则可能会导致问题,因为你是路过的结果,这两个活动。

而且在QuizActivity类不是从捆绑如下得到意图值:

Intent b = getIntent(); 
    qid=b.getIntExtra("start",0); 

编辑:

让您timetotake变量public staticAgeCalculation活性

public static int timetotake; 

并在您的ResultActivity中访问它如下:

int timetobetaken= AgeCalculation.timetotake; 
+0

,但在AgeCalculation活动中,我可以在同一个按钮单击(onClickListener)中声明2个intents还是有任何其他方式发送数据? – user3167936

+0

不,根据一些条件开始活动。您不能同时开始两个活动。 – GrIsHu

+0

耶正好你告诉问题先生,但如何以其他方式我可以从AgeCalculation类发送数据“timetotake”到ResultActivity类。 – user3167936

相关问题