带动态setMessage的时间拨号框(动态文本)

时间:2014-06-06 14:17:17

标签: android dynamic text timer android-alertdialog

我有一个带有TextView(textCountdown)的倒计时器,显示倒计时的时间。用户可以单击“设置时间”按钮,并出现TimePickerDialog框。

我想在我的TimePickerDialog框中使用相同的textCountdown,以便用户可以在“拨号”框中查看倒计时。

当我使用timePickerDialog.setMessage命令时,显示的时间是用户按下“设置时间”按钮并创建TimePickerDialog框的时间。 因此timePickerDialog.setMessage命令显示静态文本。

我希望它是动态的,并显示倒计时的时间。

我上传了一张图片,以便更好地了解我的意思:Count Down Timer

  btnDialBoxTime.setOnClickListener(new OnClickListener() {
        @SuppressWarnings("deprecation")
        public void onClick(View v) {


            final CustomTimePickerDialog timePickerDialog = new CustomTimePickerDialog(AdvancedCDT.this, TimePickerDialog.THEME_DEVICE_DEFAULT_DARK, timeSetListener, 0, 1, true);

            timePickerDialog.setTitle("Add Time");

            timePickerDialog.setMessage("" + -hourse + ":" + "" + String.format("%02d", -minutes) + ":" + String.format("%02d", -seconds) + ":" + String.format("%03d", -milliseconds));
.    
.    
.               
public static class CustomTimePickerDialog extends TimePickerDialog
      {
          public CustomTimePickerDialog (Context arg0,  int theme, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView)
        {
              super(arg0, theme, callBack, hourOfDay, minute, is24HourView);

        }
public int getMinute(int minute)
{
  return minute;


   }
  }

    .
    .
    .
private CustomTimePickerDialog.OnTimeSetListener timeSetListener = new CustomTimePickerDialog.OnTimeSetListener()
          {
            @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute)
                {
        // Do some things.....

            }
          }; 

计时器的代码:

private Runnable updateTimerMethod = new Runnable()
      {
        public void run()
        {

         timeInMillies = SystemClock.uptimeMillis() - startTimeMil - startTime ;
         finalTime =  timeSwap + timeInMillies;

          seconds = ((int)(finalTime / 1000L));
          minutes = seconds / 60;

          seconds %= 60;

          hourse = (minutes / 60);


          int milliseconds = (int) (finalTime % 1000);
          int i = (int)(finalTime % 1000L);


          textCountdown.setText("" + -hourse + ":" + "" + String.format("%02d", -minutes) + ":" + String.format("%02d", -seconds) + ":" + String.format("%03d", -milliseconds));

          myHandler.postDelayed(this, 0L);


        }
      };

更新1 ----------------------

所以我尝试了这个:

final CustomTimePickerDialog timePickerDialog = new CustomTimePickerDialog(AdvancedCDT.this, TimePickerDialog.THEME_DEVICE_DEFAULT_DARK, timeSetListener, 0, 1, true);

    customCDT.setText("" + String.format("%01d", counterHoure + counterHoureDial) + ":" + "" + String.format("%02d", counterFiveMin + counterMinDial) + ":" + String.format("%02d", -seconds) + ":" + String.format("%03d", milliseconds));

            FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
            fl.addView(customCDT, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

我收到NullPoiterException。我也见过这个Custom AlertDialog...,但它没有帮助。

我还尝试使用 timePickerDialog.setCustomTitle(textCountdown); 但是我得到了:

java.lang.IllegalStateException:指定的子级已有父级。您必须先在孩子的父母身上调用removeView()。

没有创建自定义布局,有没有办法做到这一点? 我可以在TextView上使用:addTextChangedListener吗?

更新2 --------------

为NullPoiterException添加了logCat。我没有custom.xml布局。

06-10 15:40:48.564: D/dalvikvm(6675): GC_FOR_ALLOC freed 18K, 1% free 23584K/23636K, paused 13ms, total 13ms
06-10 15:40:48.584: I/dalvikvm-heap(6675): Grow heap (frag case) to 37.250MB for 14878736-byte allocation
06-10 15:40:48.604: D/dalvikvm(6675): GC_FOR_ALLOC freed 1K, 1% free 38113K/38168K, paused 14ms, total 14ms
06-10 15:40:48.814: E/MediaPlayer(6675): Should have subtitle controller already set
06-10 15:40:51.217: D/AndroidRuntime(6675): Shutting down VM
06-10 15:40:51.217: W/dalvikvm(6675): threadid=1: thread exiting with uncaught exception (group=0x41c06ba8)
06-10 15:40:51.227: E/AndroidRuntime(6675): FATAL EXCEPTION: main
06-10 15:40:51.227: E/AndroidRuntime(6675): Process: com.example.marios_splash, PID: 6675
06-10 15:40:51.227: E/AndroidRuntime(6675): java.lang.NullPointerException
06-10 15:40:51.227: E/AndroidRuntime(6675):     at com.example.marios_splash.AdvancedCDT$7.onClick(AdvancedCDT.java:204)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.view.View.performClick(View.java:4438)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.view.View$PerformClick.run(View.java:18422)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.os.Handler.handleCallback(Handler.java:733)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.os.Handler.dispatchMessage(Handler.java:95)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.os.Looper.loop(Looper.java:136)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at android.app.ActivityThread.main(ActivityThread.java:5017)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at java.lang.reflect.Method.invokeNative(Native Method)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at java.lang.reflect.Method.invoke(Method.java:515)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-10 15:40:51.227: E/AndroidRuntime(6675):     at dalvik.system.NativeStart.main(Native Method)

我能够使用它:TextView clone

    TextView cloned = new TextView(getApplicationContext());
    cloned.setText(textCountdown.getText());
    cloned.setLayoutParams(textCountdown.getLayoutParams());

    timePickerDialog.setCustomTitle(cloned);

但标题仍然是静态的,只有点击一次才会更新。

1 个答案:

答案 0 :(得分:0)

试试这个。我没有,但我想它会起作用。

    @SuppressWarnings("deprecation")
    public void onClick(View v) {

        final CustomTimePickerDialog timePickerDialog = new CustomTimePickerDialog(AdvancedCDT.this, TimePickerDialog.THEME_DEVICE_DEFAULT_DARK, timeSetListener, 0, 1, true);
        timePickerDialog.setTitle("Add Time");
        FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
        fl.addView(textCountdown, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
    }

您基本需要做的是为对话框设置自定义布局。初始化FrameLayout并添加textView应该这样做。我不知道处理程序是否仍然可以更新它,但值得一试。

请查看此文档:http://developer.android.com/reference/android/app/AlertDialog.html

一切顺利。