活动间的计时器

时间:2017-01-19 22:20:33

标签: java android android-fragments android-activity

我希望在更多活动中看到一个计时器:

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中的按钮时,他的应用程序正确地将我带到显示相同计时器减少的activity2,如果我返回应用程序仍然正常工作,但如果再次单击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) 

非常感谢

1 个答案:

答案 0 :(得分:0)

您不应该也不能通过意图传递片段实例。

如果您需要在多个活动之间共享计时器进度,只需通过意图或存储值在数据库/共享偏好/一个活动中的任何内容中传递进度,并将其恢复到另一个活动中。