19

如何创建打开日期选择器对话框的 Android 微调器?

我想要一个看起来像日历应用程序中的 Spinner,如下面的屏幕截图所示。

Android 日历应用程序的屏幕截图,突出显示了所需的 GUI 元素

我已经尝试过的:

我在布局 XML 中创建了一个微调器,并尝试设置 onclick 属性以调用显示对话框的方法。当我在“单击时”中输入方法名称时,出现错误提示“找不到以下类:- Spinner(更改为 android.widget.Spinner,修复构建路径,编辑 XML)”。

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="showDatePickerDialog" />

showDatePickerDialog 在正确的类中:

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "Date");
}

这是 DatePickerFragment (从另一个网站复制):

import java.util.Calendar;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.widget.DatePicker;

public class DatePickerFragment extends DialogFragment
                        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

解决方案:

我在另一个问题上找到了解决方案。

我在布局文件中使用了常规微调器,然后在我的活动类中使用了以下代码:

dateSpinner = (Spinner)findViewById(R.id.spinner_date);

View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDatePickerDialog(v);
        }
        return true;
    }
};

View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            showDatePickerDialog(v);
            return true;
        }
        else {
            return false;
        }
    }
};

dateSpinner.setOnTouchListener(Spinner_OnTouch);
dateSpinner.setOnKeyListener(Spinner_OnKey);

它似乎有点被黑客入侵,但它确实有效。有谁知道更清洁的方法吗?它不会让我 setOnClickListener() 或 setOnItemClickListener() 在微调器上。

4

3 回答 3

13

我能够很容易地实现它。它看起来与日历应用程序完全一样 :)

使用 TextView 并给它一个微调器样式:

<TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   style="@android:style/Widget.Holo.Spinner" />

对于没有 Holo 主题的 API 10 及更低版本,请使用:

style="@android:style/Widget.Spinner"
于 2013-05-30T16:18:29.073 回答
12

我认为通常人们在这种情况下所做的是使用按钮并将其设置为微调器(这里的一种方法我认为一种更好的方法,主要只是将样式设置为 android.R.attr.spinnerStyle),或者他们使用微调器但重载点击动作创建一个对话框。

当然,困难的部分是创建自定义对话框,其中包含漂亮的月/日/年旋转事物(它们不是旋转器......它们有点像老虎机或其他东西)!

有几种方法可以解决这个问题,这里有一些谷歌文档,你总是可以直接提取android 源代码(尽管有明显的缺点)。

于 2012-09-17T19:09:11.837 回答
2

按钮是最好的方法,您只需要更改按钮样式。我尝试将默认的 android 微调器样式设置为我的按钮,但它无法正常工作。所以我制作了自己的样式(它是默认微调器样式的副本)。这里是:

    `<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_enabled="false"
              android:drawable="@drawable/spinner_disabled_holo_light" />
        <item android:state_pressed="true"
              android:drawable="@drawable/spinner_pressed_holo_light" />
        <item android:state_pressed="false" android:state_focused="true"
              android:drawable="@drawable/spinner_focused_holo_light" />
        <item android:drawable="@drawable/spinner_default_holo_light" />
    </selector>

`

您将在..\sdk\platforms\android-%%\data\res\drawable中找到的图像。

这对我来说很好。这是一种制作按钮微调器样式的简单方法,就像 Google 日历上的微调器一样。

于 2012-12-30T23:16:32.160 回答