2017-01-19 22 views
0

我想有一個計時器在更多的活動可見:定時器

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <Button 
     android:text="Button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/button" 
     android:onClick="buttonclick"/> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/fragmentcontainer"> 

    </FrameLayout> 


</RelativeLayout> 

Fragment_chrono.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:text="00:00" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/textViewchrono" /> 


</LinearLayout> 

activity2.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/fragmentcontainer2"> 

    </FrameLayout> 


</LinearLayout> 

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    ChronoFragment cf; 

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


     //create class with fragment 
     cf= new ChronoFragment(); 


    } 

    int numberclick=0; 
    Intent i; 

    public void buttonclick(View v){ 

     //add fragment to this class 
      getSupportFragmentManager().beginTransaction().add(R.id.fragmentcontainer, cf).commit(); 

     //pass class cf to another activity Activity2 
      i=new Intent(MainActivity.this,Activity2.class); 
      i.putExtra("Class",cf); 
      startActivity(i); 
    } 

} 

ChronoFragment.java:

public class ChronoFragment extends Fragment implements Serializable{ 

    TextView chronot; 
    private CountDownTimer Timer; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_chrono, container, false); 
     chronot= (TextView) v.findViewById(R.id.textViewchrono); 
     start(); 

     return v; 
    } 

    public void start(){ 
     Timer= new CountDownTimer(3600000, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 

       chronot.setText(String.format("%02d:%02d:%02d", 
         TimeUnit.MILLISECONDS.toHours(millisUntilFinished), 
         TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - 
           TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)), 
         TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
           TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 
      } 

      @Override 
      public void onFinish() { 
       chronot.setVisibility(View.GONE); 
      } 
     }.start(); 
    } 

} 

Activity2.java:

public class Activity2 extends AppCompatActivity{ 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity2); 


     Intent in=getIntent(); 
     ChronoFragment cf= (ChronoFragment) in.getSerializableExtra("Class"); 

     getSupportFragmentManager().beginTransaction().add(R.id.fragmentcontainer2, cf).commit(); 


    } 

} 

當我點擊在Mainactivity,他申請按鈕,正確,使我出了相同的計時器遞減,如果我回去,應用程序仍然工作正常的活性2,但如果在Mainactivity按鈕的應用程序崩潰,並再次點擊這個錯誤:

logcat的(崩潰的開始):

01-19 22:15:17.982 23583-23583/com.timerbetweenactivities E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.timerbetweenactivities, PID: 23583 
java.lang.IllegalStateException: Could not execute method for android:onClick 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.timerbetweenactivities.ChronoFragment) 
    at android.os.Parcel.writeSerializable(Parcel.java:1394) 
    at android.os.Parcel.writeValue(Parcel.java:1341) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
    at android.os.Bundle.writeToParcel(Bundle.java:1034) 
    at android.os.Parcel.writeBundle(Parcel.java:669) 
    at android.content.Intent.writeToParcel(Intent.java:7485) 
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2411) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496) 
    at android.app.Activity.startActivityForResult(Activity.java:3745) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
    at android.app.Activity.startActivityForResult(Activity.java:3706) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:856) 
    at android.app.Activity.startActivity(Activity.java:4016) 
    at android.app.Activity.startActivity(Activity.java:3984) 
    at com.timerbetweenactivities.MainActivity.buttonclick(MainActivity.java:37) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.io.NotSerializableException: com.timerbetweenactivities.ChronoFragment$1 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) 
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) 
    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 
    at android.os.Parcel.writeSerializable(Parcel.java:1389) 
    at android.os.Parcel.writeValue(Parcel.java:1341) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
    at android.os.Bundle.writeToParcel(Bundle.java:1034) 
    at android.os.Parcel.writeBundle(Parcel.java:669) 
    at android.content.Intent.writeToParcel(Intent.java:7485) 
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2411) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496) 
    at android.app.Activity.startActivityForResult(Activity.java:3745) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
    at android.app.Activity.startActivityForResult(Activity.java:3706) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:856) 
    at android.app.Activity.startActivity(Activity.java:4016) 
    at android.app.Activity.startActivity(Activity.java:3984) 
    at com.timerbetweenactivities.MainActivity.buttonclick(MainActivity.java:37) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

非常感謝

回答

0

你不應該也不能傳遞片段例如六一個意圖。

如果你需要共享一些活動之間定時器進步,只是通過在數據庫/共享偏好/在任何一個活動,而在另一個恢復它的意圖或存儲值傳遞的進展。

+0

也許我錯了,但我不會有一個單一的計時器,但一個活動, – John

+0

是的,你錯了 – Divers

+0

你能給我一個代碼的例子嗎?謝謝 – John