gpt4 book ai didi

android - 如何将主要 Activity 和日期选择器分离到自己的类(class)

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:25 25 4
gpt4 key购买 nike

这件小事开始让我很沮丧。我认为这是一件简单的事情,但我想我还没有清楚地了解 android 是如何工作的。

无论如何,问题是我的 android 应用程序将有一些按钮,按下这些按钮会打开日期或时间选择器对话框。我知道如何在与主要 Activity 本身相同的类中直接实现它们,但出于维护原因以及如果有一天我要进一步开发该应用程序,我认为这不是一个好的解决方案。

我尝试了几种不同的方法来做到这一点,但每次都失败了。这让我完全不知道该做什么以及出了什么问题。

这是我尝试过的一种方法:

主要 Activity (我对其进行了简化并尝试仅提供必要的代码,因为它很长)。这是遵循单例设计模式。

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 调用后类类似于示例Hello-DatePicker在安卓开发者网站上。

我也试着像在 here 中那样做,但不同之处在于,当单击 dateButton 时,它会启动新的 Activity ,即日期选择器对话框。在这种情况下,datePicker 类是这样的:

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

showDialog(DATE_DIALOG_ID);
}

其余部分与 android 开发站点中的 Hello-DatePicker 示例相同。这两种解决方案都会导致我的应用程序崩溃并被迫退出的问题。

我希望您了解问题所在,并希望您能指导我并指出我做错了什么。我尽量简短,只提供必要的信息。

谢谢-Z

编辑:

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

最佳答案

我想我可以帮到你。

我知道我的解决方案不会遵循您的单例方法,但它肯定会将 DatePicker 代码与调用 Activity 或多个 Activity 分开 - 这反过来会变得模块化和干净。

所以这里是这样的:下面是指定DatePicker的代码(我把它命名为DateSelector)。您启动此 activityForResult,它将向调用 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"
/>

您的调用 Activity 或 Activity 应该启动 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 中,只需在 ActivityResult 上捕获它:

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;
}
}

希望对你有所帮助,希望你喜欢,

最好的,

-塞尔坎

关于android - 如何将主要 Activity 和日期选择器分离到自己的类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com