如何将主要活动和日期选择器与自己的类分开

时间:2011-11-14 10:11:12

标签: android class android-widget singleton datepicker

这件小事开始让我很沮丧。我认为这是一个类似的事情,但我想我还没有清楚地理解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);
    }
}

日期选择器类(扩展了Activity;还简化了代码和删除了所有不必要的东西):

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调用之后,该类与android开发人员站点中的示例Hello-DatePicker类似。

此外,我尝试在here中完成此操作,但不同之处在于,当单击dateButton时,它会启动新活动,即日期选择器对话框。在这种情况下,datePicker类是这样的:

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

    showDialog(DATE_DIALOG_ID);
}

其余部分位于android dev网站的Hello-DatePicker示例中。这两种解决方案都会导致我的应用程序崩溃并被迫退出的问题。

我希望你明白这是什么问题,你可以指导我并展示我做错了什么。我试图简短地提供这些信息。

由于 -Z

编辑:

正如我在其中一条评论中提到的,真正的问题是我只是忘记将新活动添加到清单文件中。可能已经有一些其他问题已经被接受的答案解决了。我希望这对任何面临类似问题的人都有帮助。

1 个答案:

答案 0 :(得分: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;

从调用Activity:

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

最后在你的调用Activity中只需捕获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