Фрагменты Android: обновление текста в потоке после переключения фрагмента
Я пытаюсь создать небольшое приложение для записи голоса с 3 вкладками в качестве фрагментов. Я узнал, что 2 вкладки будут созданы с помощью onCreateView при запуске приложения. Сначала я ожидал, что onCreatView в PlaceHolderFragment будет вызываться для отображения нового фрагмента при каждом переключении фрагмента. (Это простая демонстрация Fragment Acitivty в Android Studio, которую я добавил для записи голоса).
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView;
Integer section = getArguments().getInt(ARG_SECTION_NUMBER);
switch (section) {
case 1:
rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
final TextView timeView;
timeView = (TextView) rootView.findViewById(R.id.timeView);
//Button start_stop;
final Button start_stop = (Button) rootView.findViewById(R.id.button);
start_stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MainActivity mainAct = (MainActivity) getActivity();
if (recorder == null) {
recorder = new MediaRecorder();
}
if (mainAct.running) {
recorder.stop();
start_stop.setText("start recording");
mainAct.running = false;
mainAct.time = 0;
} else {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/myrecording.mp3");
recorder.setOutputFile(getActivity().getApplicationContext().getFilesDir() + "/audio.mp3");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
mainAct.running = true;
mainAct.initThread(timeView);
start_stop.setText("stop recording");
}
}
});
break;
case 2:
rootView = inflater.inflate(R.layout.fragment_sound, container, false);
break;
case 3:
rootView = inflater.inflate(R.layout.fragment_pics, container, false);
break;
default:
rootView = null;
break;
}
return rootView;
}`
Записанная продолжительность будет отображаться в TextView. Время обновляется в новой теме.
public void initThread(final TextView timeView) {
refreshThread = new Thread(new Runnable() {
public void run() {
while (running) {
time = time + 0.1;
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
}
runOnUiThread(new Runnable() {
public void run() {
timeView.setText(getString(R.string.time_string, String.format("%.1f", time)));
}
});
}
}
});
refreshThread.start();
}
пока все работает нормально - запись выполняется, когда я на первой вкладке (которая отображает продолжительность) - даже когда я переключаюсь на вторую вкладку. Но когда я переключаюсь на третью вкладку и возвращаюсь к первой вкладке, длительность больше не отображается.
точный: когда я перешел с вкладки 1 на вкладку 2 и вернулся на вкладку 1, время все еще обновляется, как и ожидалось. Переход от вкладки 1 к вкладке 2 к вкладке 3 и обратно к вкладке 2 и вкладке 1 на этом экране кажется начальным. Время больше не будет обновляться - TextView имеет начальный текст. Я отлаживал приложение, возвращаясь из Таблицы 3, Угроза все еще работает, но TextView не получит текущую продолжительность.
Может кто-нибудь дать мне подсказку об этом поведении? Я думаю, что при переходе к вкладке 3 фрагмент для вкладки 1 будет уничтожен, но он будет построен снова при переключении на вкладку 1.
Как решить эту проблему?
Спасибо