TTS没有阅读正确片段

时间:2015-10-29 09:49:54

标签: android android-fragments text-to-speech

我想我没有解释这个问题,因为它是WEIRD。

我需要一个类似于在线教程的应用程序,基本功能是在页面之间切换(在我的情况下是片段),内容应该读出来。

所以,我跟着Mr.Tamada" - 生命救星"教程The TTSFragments,我已将它们合并。

座右铭是以片段形式读取数据。

代码:

public class TopRatedFragment extends Fragment implements TextToSpeech.OnInitListener
{
    private static TextToSpeech tts;
    TextView tv;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false);
        tv = (TextView) rootView.findViewById(R.id.tv);
        tts = new TextToSpeech(getActivity(), TopRatedFragment.this);
        speakOut();
        return rootView;
    }

    @Override
    public void onInit(int status)
    {
        if (status == TextToSpeech.SUCCESS)
        {
            int result = tts.setLanguage(Locale.US); 
            tts.setSpeechRate(0);  
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "Language is not supported");
            } else { 
                speakOut();
            }
        } else {
            Log.e("TTS", "Initilization Failed");
        }
    }

    @Override
    public void onDestroy()
    { 
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }
        super.onDestroy();
    }

    private void speakOut()
    {
        tts.speak(tv.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
        Log.e("root ",  tv.getText().toString());
    }
}

textview中的文字正在读出来。但是,当我向后滑动时,第一个片段的文本也会在第二个片段中读取。

片段3 - >片段2(这里读取片段1文本)。

我真的不明白发生了什么。

当我从最近打开的应用列表中打开应用时,它正在阅读自己的文本。

请尽可能帮助....谢谢..

1 个答案:

答案 0 :(得分:0)

问题是,在开始时,Fragment1Fragment2一起加载。所以你可以听到来自Fragment1Fragment2 resp。

的内容

现在当你导航到Fragment2 [已经加载,因此你听不到第2章]时,Fragment3被加载,所以你可以听到第3章。

导航至Fragment3时,Fragment1将被删除。

现在,如果您从Fragment3导航到Fragment2,则会加载Fragment1。因此,你可以听到第1章。

解决方案: - 只需检查片段是否可见,然后执行其余操作。在你的情况下TTS的事情。

  1. 延长FragmentPagerAdapter
  2. 覆盖setUserVisibleHint()

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser)
    {
        super.setUserVisibleHint(isVisibleToUser);
        Log.d(TAG, "setUserVisibleHint: " + isVisibleToUser);
    }
    
  3. 现在,您可以在setUserVisibleHint() if(isVisibleToUser){}内执行您的操作,而不是onCreateView()