【问题标题】:TimepickerDialog : onTimeSet never called on samsung devices with touchwizTimepickerDialog : onTimeSet 从未使用 touchwiz 调用三星设备
【发布时间】:2014-05-23 10:05:05
【问题描述】:

我有 2 个 Edittext,当我触摸它时会弹出一个 timepickerdialog:

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTimePicker();
    }

    private void initTimePicker()
    {
        Calendar mcurrentTime = Calendar.getInstance();
        final int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
        final int minute = mcurrentTime.get(Calendar.MINUTE);

        final EditText deplacementD = (EditText) findViewById(R.id.editText1);
        final EditText deplacementF = (EditText) findViewById(R.id.editText2);


        deplacementD.setInputType(InputType.TYPE_NULL);
        deplacementF.setInputType(InputType.TYPE_NULL);

        // Attachement du timepicker
        deplacementD.setOnTouchListener(getTimePicker(hour, minute, "Start"));
        deplacementF.setOnTouchListener(getTimePicker(hour, minute,  "End"));

    }

    private OnTouchListener getTimePicker(final int heure, final int minute, final String titre)
    {
        return new OnTouchListener() {

            private boolean validated = false;

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                final EditText editTouched = (EditText) v;

                Log.d("Timepicker", "On Touch event");
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    Log.d("Timepicker", "Motion event UP");

                    TimePickerDialog mTimePicker;

                    Log.d("Timepicker", "New timepickerdialog instance");
                    mTimePicker = new TimePickerDialog(editTouched.getContext(),
                            new TimePickerDialog.OnTimeSetListener() {

                                @Override
                                public void onTimeSet(TimePicker view, int hourOfDay, int minute)
                                {
                                    Log.d("Timepicker", "OnTimeSet called");
                                    if (validated)
                                        editTouched.setText(String
                                                .format("%02d:%02d", hourOfDay, minute));
                                }

                            }, 00, 00, true);// Yes 24 hour time

                    Log.d("Timepicker", "Timepicker title set");
                    mTimePicker.setTitle(titre);

                    mTimePicker.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which)
                                {
                                    Log.d("Timepicker", "Cancel Clicked");
                                    validated = false;
                                }
                            });

                    mTimePicker.setButton(DialogInterface.BUTTON_POSITIVE,
                            getString(android.R.string.ok),
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which)
                                {
                                    Log.d("Timepicker", "Ok called");
                                    validated = true;
                                }
                            });
                    Log.d("Timepicker", "Timepicker show()");
                    mTimePicker.show();
                    Log.d("Timepicker", "out of getTimePicker return true");
                    return true;
                }
                Log.d("Timepicker", "out of getTimePicker return false");
                return false;
            }
        };
    }
}

在库存的 android 设备 (nexus s,4,5) 上一切正常。当我单击肯定按钮时,会出现时间选择器对话框并设置编辑文本。

相反,对于三星设备(S4 4.4.2 和 Note II 4.3),对话框会出现,但不会调用 onTimeSet。不过 logcat 中没有错误。

这里是放在 getTimepicker() 中的日志消息的结果:

在 nexus 设备上:

05-26 09:45:51.850: D/Timepicker(3219): Attaching timepicker
05-26 09:45:51.850: D/Timepicker(3219): Inside getTimePicker()
05-26 09:45:58.007: D/Timepicker(3219): On Touch event
05-26 09:45:58.007: D/Timepicker(3219): out of getTimePicker return false
05-26 09:45:58.027: D/Timepicker(3219): On Touch event
05-26 09:45:58.027: D/Timepicker(3219): out of getTimePicker return false
05-26 09:45:58.077: D/Timepicker(3219): On Touch event
05-26 09:45:58.077: D/Timepicker(3219): Motion event UP
05-26 09:45:58.077: D/Timepicker(3219): New timepickerdialog instance
05-26 09:45:58.167: D/Timepicker(3219): Timepicker title set
05-26 09:45:58.177: D/Timepicker(3219): Timepicker show()
05-26 09:45:58.187: D/Timepicker(3219): out of getTimePicker return true
05-26 09:46:05.745: D/Timepicker(3219): Ok called
05-26 09:46:05.745: D/Timepicker(3219): OnTimeSet called

OnTimeSet() 在我点击 OK 按钮后被调用。

在三星设备上相反:

05-26 09:47:59.500: D/Timepicker(12897): Attaching timepicker
05-26 09:47:59.500: D/Timepicker(12897): Inside getTimePicker()
05-26 09:48:01.105: D/Timepicker(12897): On Touch event
05-26 09:48:01.105: D/Timepicker(12897): out of getTimePicker return false
05-26 09:48:01.125: D/Timepicker(12897): On Touch event
05-26 09:48:01.125: D/Timepicker(12897): out of getTimePicker return false
05-26 09:48:01.160: D/Timepicker(12897): On Touch event
05-26 09:48:01.160: D/Timepicker(12897): out of getTimePicker return false
05-26 09:48:01.190: D/Timepicker(12897): On Touch event
05-26 09:48:01.190: D/Timepicker(12897): Motion event UP
05-26 09:48:01.190: D/Timepicker(12897): New timepickerdialog instance
05-26 09:48:01.230: D/Timepicker(12897): Timepicker title set
05-26 09:48:01.230: D/Timepicker(12897): Timepicker show()
05-26 09:48:01.245: D/Timepicker(12897): out of getTimePicker return true
05-26 09:48:04.700: D/Timepicker(12897): Ok called

从不调用时间设置

我应该怎么做才能使我的代码与三星设备兼容?

【问题讨论】:

  • 这听起来很奇怪和不合理..在三星设备中,当您按下文本框时会发生什么?您可以将日志添加到您的代码中,并在输出中显示带有结果的代码?
  • 在 getTimePicker 中添加了一些日志。如您所见,除了调用 OnTimeSet() 之外,结果是相同的。
  • myTextViewEditText 还是 TextView
  • 它是一个编辑文本。更正了我的问题以反映这一点。
  • 谢谢你,我想我可以正常工作了。

标签: android samsung-mobile android-timepicker


【解决方案1】:

我也遇到过类似的问题:

onTimeSet 是从我的 nexus VDM 调用的,但不是从三星 GS3 调用的。两者都有android 4.3。 This answer helped me to work through the problem.

【讨论】:

  • 使用带有时间选择器的 AlertDialog 作为视图工作!
【解决方案2】:

好吧,过了一会儿我让它工作了,我有一个三星 Galaxy S2,onTimeSet 正在被调用。我做了以下什么。

  • 您已将getTimePicker 声明为类成员并在同一位置进行了初始化,我已声明了Listener,但在onCreate 中对其进行了初始化:

    private OnTouchListener myListener;
    

然后在onCreate

final EditText myEditText = (EditText) findViewById(R.id.ed1);
final EditText myEditText2 = (EditText) findViewById(R.id.ed2);

myListener = new OnTouchListener() {

    private Boolean validated;

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        final EditText editTouched = (EditText) v;

        Log.d("Timepicker", "On Touch event");
        if (event.getAction() == MotionEvent.ACTION_UP) {
            Log.d("Timepicker", "Motion event UP");

            TimePickerDialog mTimePicker;

            Log.d("Timepicker", "New timepickerdialog instance");
            mTimePicker = new TimePickerDialog(editTouched.getContext(),
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay, int minute)
                        {
                            Log.d("Timepicker", "OnTimeSet called");
                            if (validated)
                                editTouched.setText(String
                                        .format("%02d:%02d", hourOfDay, minute));
                        }

                    }, 00, 00, true);// Yes 24 hour time

            Log.d("Timepicker", "Timepicker title set");
            mTimePicker.setTitle("TITLE");

            mTimePicker.setButton(DialogInterface.BUTTON_NEGATIVE, "ANULAR",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                            Log.d("Timepicker", "Cancel Clicked");
                            validated = false;
                        }
                    });

            mTimePicker.setButton(DialogInterface.BUTTON_POSITIVE,
                    getString(android.R.string.ok),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                            Log.d("Timepicker", "Ok called");
                            validated = true;
                        }
                    });
            Log.d("Timepicker", "Timepicker show()");
            mTimePicker.show();
            Log.d("Timepicker", "out of getTimePicker return true");
            return true;
        }
        Log.d("Timepicker", "out of getTimePicker return false");
        return false;
    }
};

myEditText.setOnTouchListener(myListener);
myEditText2.setOnTouchListener(myListener);

结果如下:

希望对你有帮助。

【讨论】:

  • 您删除了 getTimepicker() 方法并将代码放入 setOnTouchListener 对吗?我有 6 个 EditText 需要相同的 timepicker ,所以我显然不能这样做。顺便说一句,这样做不会改变 Galaxy note II 上的任何内容。
  • @grunk 我用两个editText测试过,检查我的答案
  • 谢谢,但不能在 GN2 上使用 android 4.3 stock samsung rom。 timepicker 的目标是触发它的edittext,而不是其他textView
  • @grunk,已编辑,现在它可以满足您的需求。您是否尝试过使用 onClick 侦听器而不是 onTouch?也许这就是问题所在。
  • 您的设备上运行的 Android 版本是什么?您的代码不会在我的 GN2 和 GS4 上触发 OnTimeSet()。我已经更新了我原来的问题,你可以试试我输入的代码吗?
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多