2011-11-14 71 views
4

這個小東西開始讓我非常沮喪。我認爲這是事實,但我認爲我並沒有清楚地瞭解Android的工作原理。如何將主要活動和日期選擇器分離到自己的類

無論如何,問題是我的android應用程序將有一些按鈕,當按下時會打開日期或時間選擇器對話框。我知道如何直接在主要活動本身的類中實現它們,但是我不認爲這是維護原因的好方法,而且如果我將在某一天進一步開發該應用程序。

我試圖通過幾種不同的方式做到這一點,每次嘗試時都失敗。這讓我對做什麼以及什麼問題毫無頭緒。

這裏有一種方法我試着這樣做:

主要活動(我簡化,並嘗試只提供必要的代碼,因爲它的長)。這是遵循單例設計模式。

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    dateButton = (Button) findViewById(R.id.editDateButton); 

    dateButton.setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    if(view.getId() == R.id.editStartDateButton) { 
     DatePickers.getInstance().setDate(dateButton); 
    } 
} 

該日期選擇器類(延伸活性;還簡化了代碼和所有不必要的東西除去):

private static DatePickers self = null; 

public static DatePickers getInstance() { 
    if (null == self) { 
     self = new DatePickers(); 
    } 
    return self; 
} 

public void setDate(Button button) { 
    theButtonUsed = button; 
    showDialog(DATE_DIALOG_ID); 
} 

後ShowDialog的調用類類似於機器人的開發者網站的示例Hello-DatePicker

此外,我試圖做的很像here,但不同之處在於,當點擊dateButton時,它會啓動日期選取器對話框的新活動。在這種情況下,日期選擇器類是這樣的:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.datePicker); 

    showDialog(DATE_DIALOG_ID); 
} 

而其餘的,因爲它是在Android開發人員網站的Hello-的DatePicker例子。這兩種解決方案都會導致我的應用程序崩潰並被迫退出的問題。

我希望你明白這個問題是什麼,你可以引導我,並顯示我做錯了什麼。我試圖做到這一點,只提供必要的信息。

感謝 -Z

編輯:

正如我在一個評論都提到,這個真正的問題是,我簡直忘了新的活動添加到清單文件。接受的答案可能會解決一些其他問題。我希望這對面臨類似問題的任何人都有幫助。

回答

1

我想我可以幫你。

我知道我的解決方案不會遵循你的單例方法,但它確實將DatePicker代碼從調用的Activity或Activities中分離出來 - 這反過來又變得模塊化和乾淨。

所以這裏去: 下面是指定的DatePicker代碼(我將它命名爲DateSelector)。你開始這個activityForResult,它將返回一個包含Day,Month和Year的包到調用Activity。

我也要粘貼簡單的佈局DateSelector在它下面使用;它只是一個透明的佈局...

package com.cyberfabric.historicise.activities; 

import java.util.Calendar; 

import com.cyberfabric.historicise.R; 
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.content.Intent; 
import android.os.Bundle; 

import android.view.Window; 


public class DateSelector extends Activity{ 

    private final static int DIALOG_DATE_PICKER = 0; 

    private int setYear; 
    private int setMonth; 
    private int setDay; 


    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.date_picker); 

     Calendar today = Calendar.getInstance(); 
     setYear = today.get(Calendar.YEAR); 
     setMonth = today.get(Calendar.MONDAY); 
     setDay = today.get(Calendar.DAY_OF_MONTH); 

     showDialog(DIALOG_DATE_PICKER); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id){ 
     switch(id){ 
      case DIALOG_DATE_PICKER: 
       return new DatePickerDialog(this, mDateSetListener, setYear, setMonth, setDay); 
      } 
     return null; 
    } 

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener(){ 
     @Override 
     public void onDateSet(android.widget.DatePicker view, int year, int month, int day) { 
      setYear = year; 
      setMonth = month; 
      setDay = day; 
      returnDate(); 
     } 
    }; 


    /* 
    * Package up the data and return it back to the calling intent 
    */ 
    private void returnDate(){ 
     Intent intent = getIntent(); // calling/parent intent // 

     Bundle bundle = new Bundle(); 
     bundle.putInt("year", setYear); 
     bundle.putInt("month", setMonth); 
     bundle.putInt("day", setDay); 
     intent.putExtra("set_date", bundle); 

     setResult(Activity.RESULT_OK, intent); 

     finish(); 
    } 
} 

這裏是佈局DateSelector用途:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@color/transparent" 
    /> 

您的呼叫活動或活動應該推出DateSelector這樣:

// some global variable declared in order to start activityForResult and to catch 
// it back on onActivityResult 
private final static int REQUEST_GET_DATE = 3; 

從調用活動啓動DateSelector:

Intent dp = new Intent(EventForm.this, DateSelector.class); 
EventForm.this.startActivityForResult(dp, REQUEST_GET_DATE); 

最後在自己的人生使命的活動正好趕上它onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 

    switch(requestCode){ 
     case REQUEST_GET_DATE: 
      if(resultCode == Activity.RESULT_OK){ 
       Bundle setDate = data.getBundleExtra("set_date"); 
       int setDay = setDate.getInt("day"); 
       int setMonth = setDate.getInt("month"); 
       int setYear = setDate.getInt("year"); 
       System.out.println(setDay + " " + setMonth + " " + setYear); 
      } 
      break; 
    } 
} 

我希望這可以幫助,希望你喜歡它,

最佳,

-serkan

+0

謝謝您的回答。這經過了一些修改,但這個問題的真正原因是真的沒有意思:我忘了將新的活動添加到清單文件中:3 – zaplec

+0

哪些修改適用?它沒有以原始形式工作?如果你評論或編輯serkan的原始答案將是有用的。10q – Ewoks

相關問題