почему tts не меняет язык в Android Fragment, но отлично работает в Activity? - PullRequest
0 голосов
/ 04 августа 2020

Итак, я пытался изменить язык TTS внутри фрагмента, но он не работает, но тот же код отлично работает внутри MainActivity. Не понимаю почему. Я проверил другие решения, но ни одно из них не помогло мне. Я пробовал другое решение , решение , но даже это не работает.

public class HomeFragment extends Fragment  implements TextToSpeech.OnInitListener{
    private static final int TTS_DATA_CHECK = 1;
    private TextToSpeech engine;
    private SettingsViewModel settingsViewModel;
    private EditText textMsg;
    private Button button;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        engine = new TextToSpeech(getContext(),this);
        settingsViewModel = new ViewModelProvider(getActivity()).get(SettingsViewModel.class);
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        textMsg = view.findViewById(R.id.textMsg);
        button = view.findViewById(R.id.playButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                engine.speak(textMsg.getText().toString(), TextToSpeech.QUEUE_FLUSH, null,null);
            }
        });
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        settingsViewModel.getLanguage().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(String s) {
                Log.d("LANGUAGE_SELECTED",s);
                switch (s){
                    case "ENGLISH":
                        engine.setLanguage(Locale.ENGLISH);
                        break;
                    case "FRENCH":
                        engine.setLanguage(Locale.FRENCH);
                        break;
                }
            }
        });
    }

    @Override
    public void onInit(int status) {
        if(status==TextToSpeech.SUCCESS){
            int result = engine.setLanguage(Locale.ENGLISH);
            if(result == TextToSpeech.LANG_MISSING_DATA
                    || result== TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(getContext(),"Not supported",Toast.LENGTH_LONG).show();
            }
        }else{
            Toast.makeText(getContext(),"TTS is missing",Toast.LENGTH_LONG).show();
        }
    }

}

1 Ответ

1 голос
/ 05 августа 2020

Сначала вам нужно инициализировать TTS в основном действии, как это -

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
 
    private static final int TTS_DATA_CHECK = 101;
    static TextToSpeech engine;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        engine = new TextToSpeech(this,this);
    }

    
    @Override
    public final void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 101)
        {
            if (resultCode != TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
            {
                final Intent tnt = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(tnt);
            }
        }
    }

    @Override
    public void onInit(int status) {
        if(status==TextToSpeech.SUCCESS){
            if(TTS_DATA_CHECK == TextToSpeech.LANG_MISSING_DATA
              || TTS_DATA_CHECK== TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(this,"Not supported",Toast.LENGTH_LONG).show();
            }
        }
    }

    static public TextToSpeech getInstance() {
        return engine;
    }

}

Затем вам нужно вызвать экземпляр TTS внутри фрагмента следующим образом. Обратите внимание, что MainActivity является родительским действием данного фрагмента.

Теперь замените следующий код в своем фрагменте этим кодом -

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("VMA","OnActivityCreated");
        settingsViewModel.getLanguage().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(String s) {
                Log.d("VMA","LANGUAGE_SELECTED " + s);
                switch (s){
                    case "FRENCH":
                        MainActivity.getInstance().setLanguage(Locale.FRENCH);
                        break;
                    case "ENGLISH":
                        MainActivity.getInstance().setLanguage(Locale.ENGLISH);
                        break;
                }
            }
        });
    }  

Кроме того, вы можете удалить остальную часть TTS код из фрагмента. Вы этого больше не делаете.

...