Igo*_*man 0 android timer fragment
我有2个碎片。在他们之间的交易中我正在替换他们。在第二个片段上,我有一个计时器女巫更新 TextView。这是我需要的流程。
我的问题是,当我回到第二个片段并且计时器正在运行时,TextView 不再更新。
这是我的代码:
主要活动:
public class MainActivity extends AppCompatActivity{
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setFragmentTransaction(null);
}
/**
* A fragment transaction Method
*
* @param fragment the fragment we want to display
*/
public void setFragmentTransaction(Fragment fragment) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
//replacing fragments new Fragments
if (fragment != null ) {
fragmentTransaction.replace(R.id.container, fragment);
} else if(fragment == null && (fragmentManager.getBackStackEntryCount() == 0)) { // starting with main Fragment
fragmentTransaction.add(R.id.container, new MainFragment());
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
}
Run Code Online (Sandbox Code Playgroud)
}
主要片段:
public class MainFragment extends Fragment {
private Context context;
private View view;
private Button button;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_main, container, false);
button = (Button) view.findViewById(R.id.mainBTN);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).setFragmentTransaction(new TimerFragmnet());
}
});
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
定时器片段:
public class TimerFragmnet extends Fragment {
private Context context;
private TextView timerTextView;
private Button startBTN, backBTN;
private View view;
private Timer timer;
private int timerSec;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_timer, container, false);
timerTextView = (TextView) view.findViewById(R.id.timerTextView);
startBTN = (Button) view.findViewById(R.id.startBTN);
backBTN = (Button) view.findViewById(R.id.backBTN);
startBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startTimer(180);
}
});
backBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity) context).setFragmentTransaction(new MainFragment());
}
});
return view;
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i("Timer", msg.toString());
timerTextView.setText(createDateFormat((int) msg.obj));
}
};
private void startTimer(final int seconds) {
timerSec = seconds;
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Message message = Message.obtain();
message.obj = timerSec;
message.setTarget(mHandler);
mHandler.sendMessage(message);
timerSec--;
}
}, 100, 1000);
}
/**
* Setting the timer format
*
* @param seconds
* @return
*/
public String createDateFormat(int seconds) {
return String.format("%02d:%02d", (seconds % 3600) / 60, (seconds % 60));
}
}
Run Code Online (Sandbox Code Playgroud)
我终于做到了:我创建了一个新的类,它使所有计时器处理并在我的片段中实现他的回调:在任何情况下我都会在此处使用代码:
主要活动:
public class MainActivity extends AppCompatActivity {
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setFragmentTransaction(null);
}
/**
* A fragment transaction Method
*
* @param fragment the fragment we want to display
*/
public void setFragmentTransaction(Fragment fragment) {
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
//replacing fragments new Fragments
if (fragment != null ) {
fragmentTransaction.replace(R.id.container, fragment);
} else if(fragment == null && (fragmentManager.getBackStackEntryCount() == 0)) { // starting with main Fragment
fragmentTransaction.add(R.id.container, new MainFragment());
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
}
}
Run Code Online (Sandbox Code Playgroud)
主要片段:
public class MainFragment extends Fragment {
private Context context;
private View view;
private Button button;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_main, container, false);
button = (Button) view.findViewById(R.id.mainBTN);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity)context).setFragmentTransaction(new TimerFragment());
}
});
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
计时器片段:
public class TimerFragment extends Fragment implements MyTimer.TimerRuning {
private Context context;
private TextView timerUpTextView, timerDownTextView;
private Button startBTN, backBTN, stopTimerBTN;
private View view;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
MyTimer.getInstance().setTimerRuningListener(this);
view = inflater.inflate(R.layout.fragment_timer, container, false);
timerUpTextView = (TextView) view.findViewById(R.id.timerUpTextView);
timerDownTextView = (TextView) view.findViewById(R.id.timerDownTextView);
startBTN = (Button) view.findViewById(R.id.startBTN);
backBTN = (Button) view.findViewById(R.id.backBTN);
stopTimerBTN = (Button) view.findViewById(R.id.stopTimerBTN);
startBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTimer.getInstance().startTimer(180);
}
});
stopTimerBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTimer.getInstance().stopTimer();
}
});
backBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MainActivity) context).setFragmentTransaction(new MainFragment());
}
});
return view;
}
@Override
public void onTimerChange(String remainSec, String startSec) {
timerUpTextView.setText(startSec);
timerDownTextView.setText(remainSec);
}
@Override
public void onTimerStopped(String remainSec, String startSec) {
timerUpTextView.setText(startSec);
timerDownTextView.setText(remainSec);
}
}
Run Code Online (Sandbox Code Playgroud)
MyTimer - 类
public class MyTimer {
private Timer timer;
private MyTimer.TimerRuning timerRuningListener;
private int remainingSec, startSec;
public boolean isRunning;
private static final String TAG = "MyTimer";
private static final MyTimer ourInstance = new MyTimer();
public static MyTimer getInstance() {
return ourInstance;
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
int[] timeArr = (int[]) msg.obj;
if (timeArr[0] == 0) {
MyTimer.this.stopTimer();
if(timerRuningListener != null) {
timerRuningListener.onTimerStopped(createDateFormat(0), createDateFormat(0));
}
} else {
if(timerRuningListener != null) {
timerRuningListener.onTimerChange(createDateFormat(timeArr[0]), createDateFormat(timeArr[1]));
}
}
}
};
public void startTimer(final int seconds) {
startSec = 0;
remainingSec = seconds;
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Timer running......");
isRunning = true;
Message message = Message.obtain();
int[] counters = new int[2];
counters[0] = remainingSec;
counters[1] = startSec;
message.obj = counters;
message.setTarget(mHandler);
mHandler.sendMessage(message);
remainingSec--;
startSec++;
}
}, 100, 1000);
}
/**
* Setting the timer format
*
* @param seconds
* @return
*/
public String createDateFormat(int seconds) {
return String.format("%02d:%02d", (seconds % 3600) / 60, (seconds % 60));
}
public void setTimerRuningListener(MyTimer.TimerRuning timerRuningListener) {
this.timerRuningListener = timerRuningListener;
}
public interface TimerRuning {
void onTimerChange(String remainSec, String startSec);
void onTimerStopped(String remainSec, String startSec);
}
public void stopTimer() {
if (timer != null) {
timerRuningListener.onTimerStopped(createDateFormat(0), createDateFormat(0));
isRunning = false;
timer.cancel();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |