2011-07-14 40 views
1

該應用程序具有初始消息屏幕,它在第一次運行時顯示,其中從用戶使用datepicker獲取日期,然後從下次直接轉到main.xml。這是我在的onCreate試圖 邏輯()將clickListeners放置在我的代碼中的位置?

if(<date set>) 
{ 
    <open main.xml> 
    <listeners> 
} 
else 
{ 
    <get date from user> 
    <set flag> 
    setContentView(R.layout.initial_msg); 
    <make changes in main.xml according to date> 
} 

的問題是它執行它獲得的日期,但聽衆不加載在第一時間,我認爲這是因爲根本沒有被執行的代碼。當我把偵聽器放在if塊之外時,我得到一個空指針異常。但是,當我關閉應用程序,並再次啓動它的作品,因爲這個時候打開if()阻止其他()。

public class pgactivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    SharedPreferences prefs; 
    Calendar c=Calendar.getInstance(); 
    Calendar tempDate; 
    TextView tv1,tv2; 
    Menu theMenu; 
    LayoutInflater li; 
    int week; 

DatePickerDialog.OnDateSetListener d=new DatePickerDialog.OnDateSetListener() 
{ 
    //@override 
    public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) 
    { 
     c.set(Calendar.DATE,dayOfMonth); 
     c.set(Calendar.MONTH,monthOfYear); 
     c.set(Calendar.YEAR,year); 
     if(checkValidity()) 
     { 
      SharedPreferences.Editor editor=prefs.edit(); 
      //set the flag that indicates concieved_date has been added 
      editor.putBoolean("concieved_date", true); 

      int datepref; 
      datepref=c.get(Calendar.DATE); 
      datepref=datepref*1000000; 
      datepref+=c.get(Calendar.MONTH)*10000; 
      datepref+=c.get(Calendar.YEAR); 
      editor.putInt("date",datepref); 
      editor.commit(); 
      setContentView(R.layout.main); 
      setData(); 
     } 
    } 
}; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    //check if concieved date is set from the prefs file "app_data" 
    //if yes open application page else open initial message screen to set the date 
    prefs=getApplicationContext().getSharedPreferences("app_data",Context.MODE_APPEND); 

    if(prefs.getBoolean("concieved_date", false)) 
    { 

     setContentView(R.layout.main); 
     setData(); 

     //Listener for the temp button 'false' 
     //It resets the flag used to indicate if date is set or not. used for testing purpose 
     Button btn1=(Button)findViewById(R.id.setfalse); 
     btn1.setOnClickListener(new View.OnClickListener() 
     {    
      public void onClick(View v) 
      { 
       SharedPreferences.Editor editor=prefs.edit(); 
       editor.putBoolean("concieved_date", false); 
       editor.commit(); 

       TextView tv3=(TextView)findViewById(R.id.test); 
       tv3.setText("entered listener"); 
      } 
    }); 

     //Listener for the weekly_tip text view 
     //when clicked open the layout giving the full description 
     TextView tv2=(TextView)findViewById(R.id.weekly_tip); 
     tv2.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent j=new Intent(pgactivity.this,weekly.class); 
       Bundle b=new Bundle(); 
       b.putInt("cur_week",week); 
       j.putExtras(b); 
       startActivity(j); 
      } 
     }); 

     //Listener for open_remainders button to switch to Remainders page 
     Button btn2=(Button)findViewById(R.id.open_remainders); 
     btn2.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent i=new Intent(pgactivity.this,RemaindersPage.class); 
       startActivity(i); 
      } 
     }); 
    } 
    else 
    { 
     setContentView(R.layout.initial_msg); 

     //click listener for textview 2 
     TextView tv1=(TextView)findViewById(R.id.init_msg); 
     tv1.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       SharedPreferences.Editor editor=prefs.edit(); 
       editor.putBoolean("concieved_date", true); 
       editor.commit(); 

       new DatePickerDialog(pgactivity.this,d, 
         c.get(Calendar.YEAR), 
         c.get(Calendar.MONTH), 
         c.get(Calendar.DAY_OF_MONTH)).show(); 
      } 
     }); 
    } 

} 

void setData() 
{ 
    Long sec,tempSec; 
    int date,day,month,year; 
    date=prefs.getInt("date", 10101010); 
    day=date/1000000; 
    date=date%1000000; 
    month=date/10000; 
    date=date%10000; 
    year=date; 
    c.set(year, month, day); 
    tempDate=c; 

    //insert value to concieved_date textfield 
    tv1=(TextView)findViewById(R.id.concieved_date); 
    tv1.setText(android.text.format.DateFormat.format("dd MMM yyyy", tempDate)); 

    //insert value to delivery_date 
    tv1=(TextView)findViewById(R.id.delivery_date); 
    tempDate.add(Calendar.DATE, 280); 
    tv1.setText(android.text.format.DateFormat.format("dd MMM yyyy", tempDate)); 

    //insert value to days_to_delivery 
    tv1=(TextView)findViewById(R.id.days_to_delivery); 
    c=Calendar.getInstance(); //c has current date 
    sec=tempDate.getTimeInMillis()-c.getTimeInMillis(); //find diff in millisecs 
    sec=sec/86400000; 
    tv1.setText(sec.toString()); 

    //insert value for days_into_pregnancy 
    tv1=(TextView)findViewById(R.id.days_into_pregnancy); 
    tempSec=280-sec; 
    tv1.setText(tempSec.toString()); 

    //insert value for current_week 
    tv1=(TextView)findViewById(R.id.current_week); 
    tempSec=tempSec/7; 
    week=tempSec.intValue(); 
    tv1.setText(tempSec.toString()); 
} 

//user method to check the date validity : check if date entered is a reasonable value 
boolean checkValidity() 
{ 
    Long duration; 
    tempDate=Calendar.getInstance(); //get today's date in c 

    //check if user date is on or before today's date 
    if(tempDate.before(c)) 
    { 
     AlertDialog.Builder ad=new AlertDialog.Builder(this); 
     ad.setMessage("Specified date should be on or before today's date"); 
     ad.setNeutralButton("OK",new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface arg0,int arg1){} 
       } 
     ); 
     ad.show(); 
     return false; 
    } 
    //check if diff between user date and todays date is more than 280 days 
    duration=tempDate.getTimeInMillis()-c.getTimeInMillis(); 
    duration/=86400000; 
    if(duration>280) 
    { 
     AlertDialog.Builder ad=new AlertDialog.Builder(this); 
     ad.setMessage("Specified date can be atmost 280 days before today's date"); 
     ad.setNeutralButton("OK",new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface arg0,int arg1){} 
       } 
     ).show(); 
     return false; 
    } 
    return true;  
} 

}

+0

在if-else塊之後設置偵聽器,而不是之前,那麼您將避免nullpointerexception – Marmoy

+0

您可能認爲通過向我們顯示僞代碼而不是實際代碼可以更容易,但只有在錯誤你的邏輯,而不是你的實現。如果你想在你的實現中遇到錯誤,請展示你的實際代碼。 – Marmoy

+0

我出去了一段時間,我已經添加了主類pgactivity.class的完整代碼 – Deepak

回答

1

如果你需要你的聽衆在else - 塊,也可以在if - 阻塞之前把這個代碼。

如果執行ifelse時佈局更改,則可以使用onClick-attribute in your XML-Layout定義。您可以使用SharedPreferences來保存您的數據。

+0

我不需要在else塊中的監聽器,因爲它們每個加載一個diff屏幕。我不能將監聽器放在外面,因爲main.xml還沒有打開,所有的監聽器都是用於main.xml中的按鈕的。 – Deepak

+0

@ user699617 - 是的,你可以把它們放在if-else塊之外,但是它們需要在if -else塊,當你的內容視圖已設置。 – Marmoy

+0

@Lukas Knuth,因爲我打電話一個單獨的活動打開最初的一次性消息程序繼續在第一個活動中執行,因此錯誤發生不起作用。 – Deepak

相關問題