2016-07-18 16 views
0

Ich habe ein Problem mit der Änderung Fragments. In meiner App verwende ich TimerTisk für die Aktualisierung TextView jede Sekunde (Timer für Benutzer), wenn wir Fragment ändern, haben wir NullPointerException. Ich weiß, warum das passiert, aber ich kann nicht aufhören TimerTask, weil mein Timer für Benutzer arbeiten sollte, bis Benutzer ihn selbst stoppen. Wie kann ich dieses Problem lösen, wie Timer im Hintergrund arbeiten könnte? Mein Fragment:wie man das Fragment ändert, ohne TimerTask zu stoppen. Android

public class WalkingFragment extends Fragment implements View.OnClickListener { 

    private String timeTxt = ""; 
    TextView textViewWalkingTimer; 
    Button startWalkingBC; 

    private Timer walkingTimer; 
    private int period = 0; 
    private boolean flag = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_walking, container, false); 

     textViewWalkingTimer = (TextView) view.findViewById(R.id.textViewWalkingTimer); 

     startWalkingBC = (Button) view.findViewById(R.id.start_walking); 
     startWalkingBC.setOnClickListener(this); 

     return view; 
    } 

    public void startWalkingButtonClick() { 

     if (!flag) { 
      walkingTimer = new Timer(); 
      walkingTimer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        TimerForWalking(); 
       } 
      }, 0, 1000); 

      startWalkingBC.setText("Stop"); 
      flag = true; 
     } else if (flag) { 
      period = 0; 
      if (walkingTimer != null) { 
       walkingTimer.cancel(); 
       flag = false; 
       textViewWalkingTimer.setText(""); 
       startWalkingBC.setText("Start"); 
      } 
     } 
    } 

    private void TimerForWalking() { 
     this.getActivity().runOnUiThread(Timer_Tick); 
    } 

    private Runnable Timer_Tick = new Runnable() { 
     @Override 
     public void run() { 
      period++; 
      timeTxt = (new SimpleDateFormat("hh:mm:ss")).format(new Date(period * 1000)); 
      textViewWalkingTimer.setText(timeTxt); 
     } 
    }; 


    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.start_walking: 
       startWalkingButtonClick(); 
       break; 

     ................. 

      default: 
       break; 
     } 
    } 
} 

Der Code funktioniert gut, bis wir Fragment ändern. Ich bin neu in Android und das meine erste App. Vielen Dank für jede Hilfe.

Antwort

0

Die Fragmente, die Sie erstellen, werden am Leben bleiben, bis der Elternteil Activity lebt. Ich empfehle Ihnen, das Fragment, in dem Sie den Timer starten, mit der Aktivität zu kommunizieren, um dessen Wert zu speichern und in einem anderen Fragment abzurufen. Ich empfehle auch, überprüfen Sie this, um zu überprüfen, wie sie kommunizieren.

Ich hoffe, es hilft.

+0

Danke. Ich werde es versuchen. – Tash