2013-09-02 3 views
0

Я работаю над Android-викториной. Я хотел добавить таймер в ImageView. В Question XML, я хочу позвонить CountDownTimer из Welcome XML на кнопку Play. Я просто установить onClick в Question xml, добавив следующую строку в ImageViewКак использовать таймер на Android-викторине?

В Вопрос XML

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/question" 
    android:layout_centerHorizontal="true" 
    android:background="@drawable/timer_bttn" 
    android:onClick="onClick"/> 

В Welcome XML

<Button 
      android:text="Play" 
      android:id="@+id/playBtn" 
      android:layout_width="80dip" 
      android:layout_alignParentRight="true" 
      android:layout_height="wrap_content" 
      android:paddingTop="5dip" 
      android:paddingBottom="5dip" 
      android:textColor="#ffffff" 
      android:background="@drawable/start_button" /> 

Затем я создал TimerActivity

public class TimerActivity extends Activity implements OnClickListener { 

private Button startB; 
public TextView text; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.question); 
startB = (Button) this.findViewById(R.id.playBtn); 
startB.setOnClickListener((OnClickListener) this); 
text = (TextView) findViewById(R.id.textView1); 
} 

@Override 
public void onClick(View v) { 
    new CountDownTimer(30000, 1000) { // adjust the milli seconds here 

     public void onTick(long millisUntilFinished) { 
     text.setText(""+String.format("%d min, %d sec", 
         TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
         TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
         TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 
     } 

     public void onFinish() { 
      text.setText("done!"); 
     } 
    }.start(); 

} 
} 

В этом коде я только что написал код таймера для вызова на изображения и реализовать код в TimerActivity. но My Timer не запускается, когда я нажимаю кнопку play.Where My Play работает в Different Activity.so может ли кто-нибудь мне помочь Как вызвать Timer В разных XML.

Мой LogCat: -

!ENTRY org.eclipse.ui 4 0 2013-09-02 17:19:38.741 
!MESSAGE Unhandled event loop exception 
!STACK 0 
java.lang.IllegalArgumentException: Widget has the wrong parent 
    at org.eclipse.swt.SWT.error(SWT.java:4342) 
    at org.eclipse.swt.SWT.error(SWT.java:4276) 
    at org.eclipse.swt.SWT.error(SWT.java:4247) 
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468) 
    at org.eclipse.swt.widgets.Control.setMenu(Control.java:3462) 
    at com.android.ddmuilib.logcat.LogCatPanel$20.handleEvent(LogCatPanel.java:1042) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
    at org.eclipse.swt.widgets.Widget.showMenu(Widget.java:1472) 
    at org.eclipse.swt.widgets.Widget.wmContextMenu(Widget.java:1574) 
    at org.eclipse.swt.widgets.Control.WM_CONTEXTMENU(Control.java:4673) 
    at org.eclipse.swt.widgets.Table.WM_CONTEXTMENU(Table.java:5972) 
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4532) 
    at org.eclipse.swt.widgets.Table.windowProc(Table.java:5913) 
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4989) 
    at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method) 
    at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2440) 
    at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:564) 
    at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:430) 
    at org.eclipse.swt.widgets.Widget.wmRButtonUp(Widget.java:2395) 
    at org.eclipse.swt.widgets.Control.WM_RBUTTONUP(Control.java:5134) 
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4596) 
    at org.eclipse.swt.widgets.Table.windowProc(Table.java:5913) 
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4989) 
    at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method) 
    at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2546) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3756) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1053) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:942) 
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:588) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:543) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1438) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1414) 

Спасибо заранее-х

+0

Ваше приложение должно потерпеть крах с кодом, который вы опубликовали. если так, то posttrace – Raghunandan

+0

опубликуйте свой 'question.xml', у вас есть изображение, я не вижу, как вы инициализируете изображение в любом месте. вы инициализируете текстовое представление с идентификатором 'button1'. Убедитесь, что ваши представления инициализированы правильно. – Raghunandan

+0

Да Во-первых, я добавил туда кнопку после этого, я удаляю ее с помощью ImageView. Есть ли какая-то проблема. Или я тоже могу изменить его ID. –

ответ

1

Я не вижу ничего плохого в вашей реализации таймера

Но у вас есть эта

text = (TextView) this.findViewById(R.id.button1); 

И у вас есть эта

<ImageView 
android:id="@+id/button1" 

Так оно и должно быть

<TextView 
android:id="@+id/textView1" 

И

text = (TextView) findViewById(R.id.textView1); 

Попробуйте нижеследующее. Начинается щелчок по таймеру кнопки.

public class MainActivity extends Activity implements OnClickListener { 

private Button startB; 
public TextView text; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
startB = (Button) this.findViewById(R.id.button1); 
startB.setOnClickListener((OnClickListener) this); 
text = (TextView) findViewById(R.id.textView1); 
} 

@Override 
public void onClick(View v) { 
    new CountDownTimer(30000, 1000) { // adjust the milli seconds here 

     public void onTick(long millisUntilFinished) { 
     text.setText(""+String.format("%d min, %d sec", 
         TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
         TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
         TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 
     } 

     public void onFinish() { 
      text.setText("done!"); 
     } 
    }.start(); 

} 
} 

Проверить ссылку

Для Java версий ниже 1.5 или для систем, которые не полностью поддерживают класс TimeUnit следующие уравнения могут быть использованы:

int seconds = (int) (milliseconds/1000) % 60 ; 
int minutes = (int) ((milliseconds/(1000*60)) % 60); 
int hours = (int) ((milliseconds/(1000*60*60)) % 24); 

Edit:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="35dp" 
     android:text="TextView" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView1" 
     android:layout_below="@+id/textView1" 
     android:layout_marginTop="68dp" 
     android:text="Button" /> 

</RelativeLayout> 

enter image description here

enter image description here

+0

Я внедрил вышеуказанный код в свой TimeActivity и добавил TextView в свой xml с таймером Id и вызываю его OnClick Play Button Но я не могу запустить Timer, а также .. :( –

+0

@akashraj опубликовать ваш обновленный код, он отлично работает, без сомнения о том, что вы делаете это неправильно – Raghunandan

+0

@akashraj проверить редактирование, он отлично работает. Возможно, вы что-то делаете неправильно, даже разместили мгновенный снимок. проверьте logcat, если вы получаете исключения. – Raghunandan

0

Вы должны попробовать следующий код.

private void setTimer() { 
    counterTimer = new CountDownTimer(finishTime * 1000, 1000) { 
     public void onFinish() { 
      //code to execute when time finished 
     } 

     public void onTick(long millisUntilFinished) { 
      int seconds = (int) (millisUntilFinished/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      if (seconds < 10) { 
       txtTimer.setText("" + minutes + ":0" + seconds); 
      } else { 
       txtTimer.setText("" + minutes + ":" + seconds); 
      } 
     } 
    }; 
    counterTimer.start(); 
} 

Здесь examFinishTime это долго значение как

private long finishTime = 5; 

Примечание: Аргументом в миллисекундах.

Чтобы запустить таймер, просто вызовите метод setTimer() в любом событии щелчка кнопки.

+0

@Chitan может ли он работать над моим измененным Вопросом. –

+0

@akashraj, вы хотите добавить слушателя в другое действие, чтобы запустить таймер запуска? Разрабатывать. Ваш вопрос мне не очень понятен. –

+0

@chitan в основном у меня есть один ImageView (где я должен позвонить своему таймеру) В вопросе XMl и Play Button (в моем приветственном XML). Когда я нажимаю кнопку «Play», я запускаю викторину, и я тоже хочу, чтобы мой таймер тоже. создал таймер. –

Смежные вопросы