TimePickerでのキーボード入力について

1,056 views
Skip to first unread message

don300j

unread,
May 8, 2011, 11:01:36 PM5/8/11
to 日本Androidの会
はじめましてdonと申します。

初めて投稿させていただきます。

現在TimePickerを使用したAndroidアプリを作成中なのですが、
ボタンの「+」「-」で設定した場合は、
getCurrentHour()
getCurrentMinute()
onTimeChanged(TimePicker view, int hourOfDay, int minute)
にて正常に、取得できるのですが、

TimePicker内のテキスト部分をソフトウェアキーボードで設定した場合は
getCurrentHour()
getCurrentMinute()
はキーボードで入力する前の値が返ってきますし、
onTimeChanged(TimePicker view, int hourOfDay, int minute)
は動作しないようです。

すみませんが、ソフトウェアキーボードで設定した場合の
値の取得方法を教えていただけませんでしょうか?

【開発環境】
開発OS WindowsXP
Android SDK Android 2.1 API 7
JDK 1.6.0_24
確認実機 Xperia X10

何か、必要な情報があれば教えてください。

以上、よろしくお願いいたします。

大垣憲俊

unread,
May 9, 2011, 11:48:53 PM5/9/11
to android-g...@googlegroups.com
donさん

大垣です。TimePickerDialog の場合は

OnTimeSetListener() の
onTimeSet(TimePicker view, int hourOfDay, int minute

取得します。

参考までに以下のリンクは、「逆引きアンドロイド入門」サイトの
「時刻選択ダイアログ(TimePickerDialog)を使用するには」です
http://www.adakoda.com/android/000104.html


don300j

unread,
May 10, 2011, 12:34:33 AM5/10/11
to 日本Androidの会
>大垣様
返信ありがとうございます。

donです。

確かにおっしゃられるとおり、
TimePickerDialogでは、onTimeSetにて取得が可能のようです。

ですが、できれば、ダイアログ表示ではなく、
Activityに張り付いた状態のTimePickerで同じようなことがしたいと考えています。

先ほどAPI DemosにもTimePickerのテストアプリが入ってることに気がついて触ってみたのですが、
(Views→Data Widgets→Inline)
やはり、「+」、「-」ボタンでは取得できているようですが、
キーボードからの入力は無視されているようでした。
不可能なことなのでしょうか?

以上です。

大垣憲俊

unread,
May 10, 2011, 3:53:09 AM5/10/11
to android-g...@googlegroups.com
donさん

大垣です。 たぶん当然のことながら、
TimePickerDialog.java と TimePicker.java の中に、
キーボード入力に対応している部分があるだろうと思い、
ソースコードを眺めていますので、何かに気づいたら、返信します。


大垣憲俊

unread,
May 10, 2011, 8:04:04 AM5/10/11
to android-g...@googlegroups.com
donさん

大垣です。 TimePickerのテキストエリアにソフトキーボードで入力した場合、
数字の入力後に、ソフトキーボードのエンターキーを入力しないと反映しないと気づきました。
したがって、エリアのフォーカスが移動した場合や、一定時間経過後に、内部的に、
エンターキーを押したことにすれば、良いのではないかと思います。

それとは別の話ですが、TimePickerの画像を使って、カスタムウィジェットをつくったことがあります。
TimePickerの画像を流用し ImageButton と EditText で簡単につくれます。
もし既存のもので望む機能が実現できない場合は、そうした手段もあります。

大垣憲俊

unread,
May 10, 2011, 8:06:03 AM5/10/11
to android-g...@googlegroups.com
Donさん

大垣です。 すみません、補足です。
検証に使ったサンプルです。時刻の値の取り方にご注意を。

public class MyActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);


        TimePicker tp = (TimePicker) findViewById(R.id.timePicker1);

        tp.setOnTimeChangedListener(new OnTimeChangedListener() {


            @Override

            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

                Log.d("MyActivity", "time=" + hourOfDay + ":" + minute);

            }


        });


    }

}

don300j

unread,
May 11, 2011, 9:47:54 PM5/11/11
to 日本Androidの会
大垣様

Donです。
返信が遅くなりまして申し訳ありません。

> 数字の入力後に、ソフトキーボードのエンターキーを入力しないと反映しないと気づきました。
> したがって、エリアのフォーカスが移動した場合や、一定時間経過後に、内部的に、
> エンターキーを押したことにすれば、良いのではないかと思います。
なるほど確認してみましたところ、時表示のところから、分表示のところへフォーカスが移動した場合にも
キーボード入力が反映されるようです。

ためしに、新たにEditTextを作成してみて、
Button押下した際に、フォーカスをチェンジしてみたところ、
値が反映されていました。

実際のアプリではほかにEditTextがないので
どうやって対応するべきか今から考えて見ます。
(ボタンにフォーカスってできるのでしょうか・・・?)

ありがとうございました。

以下にテスト用のコードを記載しておきます。

////////////main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:id="@+id/nmea_gpgsv_layout" android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/et01" android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<TimePicker android:id="@+id/tp01"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
</TimePicker>
<Button android:id="@+id/bt01" android:layout_width="75dp"
android:layout_height="wrap_content"
android:text ="toast" >
</Button>
</LinearLayout>


////////////testView.java
package com.itservice.testView;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.Toast;

public class testView extends Activity {
/** Called when the activity is first created. */

private TimePicker timePicker;
private EditText editText;
private Button button;

private int myhour;
private int myminute;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* EditText */
editText = (EditText)findViewById(R.id.et01);

/* Button */
button = (Button)findViewById(R.id.bt01);
button.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
editText.requestFocus(); /**/
Toast.makeText(testView.this, "H:" +
Integer.toString(myhour) + " M:" + Integer.toString(myminute),
Toast.LENGTH_SHORT).show();
}
});

/* TimePicker */
timePicker = (TimePicker) findViewById(R.id.tp01);
timePicker.setIs24HourView(true);
timePicker.setCurrentHour(myhour);
timePicker.setCurrentMinute(myminute);
timePicker.setOnTimeChangedListener(new
TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker view, int hourOfDay,
int minute) {
myhour = hourOfDay;
myminute = minute;
}
});
Reply all
Reply to author
Forward
0 new messages